Laravel Passport-RESTful API তৈরি টিটোরিয়াল বাংলায়

Laravel Passport
Spread the love

এই টিটোরিয়ালে দেখবো কিভাবে আমরা Rest api বানাতে পারি লারাভেল এপ্লিকেশনে। আমরা Laravel Passport ব্যবহার করবো অথেনটিকেশন এর জন্যে। register,login এবং product crud api তৈরি করবো।

লারাভেল এপ্লিকেশনে rest api তৈরি করতে ধাপে ধাপে টিউটোরিয়াল অনুসরণ  করুন।

ধাপ ১ঃ ইন্সটল লারাভেল

আমরা লারাভেল এর ডিফল্ট লগিনসহ ইন্সটল কিভাবে করতে হয় তা নিয়ে এখানে লিখেছি। যারা ইন্সটল করতে পারেন না তারা এই টিউটোরিয়াল টা দেখে নিন। যাই হোক মনে করি আপনি অলরেডি জানেন কিভাবে লারাভেল ইন্সটল করতে হই।

আশা করি PC তে লারাভেল ইন্সটল করা আছে।তাহলে আমরা পড়ের স্টেপ এ যায়

ধাপ ২ঃ ইন্সটল Laravel Passport

এই ধাপে দেখবো কিভাবে composer ব্যবহার করে Laravel passport ইন্সটল করা যায়। সো যেখানে আপনার প্রজেক্ট তৈরি করেছেন সেই ফোল্ডার এ যান আর টার্মিনাল ওপেন করে নিচের কমান্ড রান করুন

composer require laravel/passport

সফলভাবে এই প্যাকেজ ইন্সটল হবার পর আমাদের ডাটাবেজে নতুন passport টেবিল তৈরির জন্য ডিফল্ট মাইগ্রেশন দরকার। সুতরাং টার্মিনালে নিচের কমান্ড রান করুন।

php artisan migrate

তারপর আমাদের কমান্ড ব্যবহার করে Laravel passport ইন্সটল করতে হবে। এটি সিকিউরিটির জন্যে টোকেন কি তৈরি করবে। নিচের কমান্ডটি রান করুন

php artisan passport:install

ধাপ ৩ঃ Passport কনফিগারেশন

এই ধাপে আমাদের model,serviceprovider এবং auth কনফিগ ফাইল মডিফাই করে Passport কনফিগারেশন করতে হবে। নিচের ফাইলগুলোর পরিবর্তন লক্ষ্য করুন,

User model ফাইল এ Passport এর HashApiTokens class যুক্ত করেছি

app/User.php

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable implements MustVerifyEmail
{
    use HasApiTokens, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

AuthServiceProvider ফাইল এ “Passport::route()” যুক্ত করেছি

app/Providers/AuthServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        // 'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();
    }
}

auth.php ফাইল এ api auth কনফিগারেশন করেছি

config/auth.php

<?php

return [
      
    .......

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],

    ],

    .......
];

ধাপ ৪ঃ Product টেবিল মাইগ্রেশন এবং মডেল তৈরি

এখন আমাদের একটা টেবিল তৈরি করতে হবে। আমি Product নামের একটি টেবিল তৈরি করবো।নিচের কমান্ডটি আপনার টার্মিনালে রান করুন।

php artisan make:model Product -m

আমরা একটা ফাইল পাবো database ফোল্ডারে সেটি ওপেন করে নিচের মত ফাইল মডিফাই করুন

database/migrations/_create_products_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('detail');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}

আরেকটি ফাইল তৈরি হয়েছে app ফোল্ডারে সেটিও মডিফাই করবো

app/Product.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'detail'
    ];

}

এখন আমরা টার্মিনালে মাইগ্রেট রান করবো

php artisan migrate

ধাপ ৫ঃ API Routes তৈরি

এই ধাপে আমরা api রাউটস তৈরি করবো।লারাভেল এর ডিফল্ট api.php নামের একটি রাউটস ফাইল আছে সেটি ওপেন করে নিচের ফাইল এর মত পরিবর্তন করবো

routes/api.php

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::post('register', 'Api\[email protected]');

Route::middleware('auth:api')->group( function () {
    Route::resource('products', 'Api\ProductController');
});

ধাপ ৬ঃ কন্ট্রোলার ফাইল তৈরি

এই ধাপে আমরা একটি API নামের ফোল্ডার বানবো যেখানে BaseController,ProducController এবং RegisterController তৈরি করবো।আমরা সব Api আলাদা ফোল্ডারে রাখবো যাতে বুঝতে সুবিধা হয়।

app/Http/Controllers/Api/BaseController.php

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller as Controller;
use Illuminate\Http\Request;

class BaseController extends Controller
{
    /**
    * success response method.
     *
     * @return \Illuminate\Http\Response
     */
    public function sendResponse($result, $message)
    {
    	$response = [
            'success' => true,
            'data'    => $result,
            'message' => $message,
        ];

        return response()->json($response, 200);
    }

    /**
     * return error response.
     *
     * @return \Illuminate\Http\Response
     */
    public function sendError($error, $errorMessages = [], $code = 404)
    {
    	$response = [
            'success' => false,
            'message' => $error,
        ];

        if(!empty($errorMessages)){
            $response['data'] = $errorMessages;
        }

        return response()->json($response, $code);
    }
}

app/Http/Controllers/Api/ProducController.php

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Api\BaseController as BaseController;
use App\Product;
use Validator;


class ProductController extends BaseController
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $products = Product::all();

        return $this->sendResponse($products->toArray(), 'Products retrieved successfully.');

    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $input = $request->all();

        $validator = Validator::make($input, [
            'name' => 'required',
            'detail' => 'required'
        ]);

        if($validator->fails()){
            return $this->sendError('Validation Error.', $validator->errors());       
        }

        $product = Product::create($input);

        return $this->sendResponse($product->toArray(), 'Product created successfully.');

    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $product = Product::find($id);

        if (is_null($product)) {
            return $this->sendError('Product not found.');
        }

        return $this->sendResponse($product->toArray(), 'Product retrieved successfully.');

    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Product $product)
    {
        $input = $request->all();

        $validator = Validator::make($input, [
            'name' => 'required',
            'detail' => 'required'
        ]);

        if($validator->fails()){
            return $this->sendError('Validation Error.', $validator->errors());       
        }

        $product->name = $input['name'];
        $product->detail = $input['detail'];
        $product->save();

        return $this->sendResponse($product->toArray(), 'Product updated successfully.');

    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy(Product $product)
    {
        $product->delete();

        return $this->sendResponse($product->toArray(), 'Product deleted successfully.');

    }
}

app/Http/Controllers/Api/RegisterController.php

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Api\BaseController as BaseController;
use App\User;
use Auth;
use Validator;


class RegisterController extends BaseController
{
    /**
     * Register api
     *
     * @return \Illuminate\Http\Response
     */
    public function register(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|email',
            'password' => 'required',
            'c_password' => 'required|same:password',
        ]);

        if($validator->fails()){
            return $this->sendError('Validation Error.', $validator->errors());       
        }

        $input = $request->all();
        $input['password'] = bcrypt($input['password']);
        $user = User::create($input);
        $success['token'] =  $user->createToken('MyApp')->accessToken;
        $success['name'] =  $user->name;

        return $this->sendResponse($success, 'User register successfully.');
    }

}

এখন আমরা প্রস্তুত ফুল restful api এবং Passport api রান করার জন্যে। সো আগে আমাদের প্রজেক্টটি রান করবো টার্মিনাল এ

php artisan serve

আমরা Postman ওপেন করে নিচের মত টেস্ট করবো। আমরা নিচের headers টি ব্যবহার করবো যখন api এর ডিটেইলস দেখবো

'headers' => [
    'Accept' => 'application/json',
    'Authorization' => 'Bearer '.$accessToken,
]

নিচের লিংক গুলো Postman  এ দিন আর টেস্ট করুন

1) Login: GET, URL: http://localhost:8000/oauth/token

laravel passport

2) Register: POST, URL: http://localhost:8000/api/register

passport laravel

3) List: GET, URL: http://localhost:8000/api/products

laravel oauth

4) Create: POST, URL: http://localhost:8000/api/products

Laravel Passport

5) Show: GET, URL: http://localhost:8000/api/products/{id}

oauth laravel

6) Update: PUT, URL: http://localhost:8000/api/products/{id}

createtoken laravel

7) Delete: DELETE, URL: http://localhost:8000/api/products/{id}

restful api

Laravel Passport কোডটি এখানে পাবেন

SOURCE CODE

আজ এই পর্যন্তই। আপনাদের মতামত নিচের কমেন্ট বক্স এ জানাবেন। নতুন কিছু নিয়ে লিখা চাইলে সেটাও জানাতে পারেন।

আরও পড়ুন-

Leave a Reply

Your email address will not be published. Required fields are marked *