Sanctum token integration

  • Steps

    1. Integration

    1. Install Sanctum API

    
                                php artisan install:api
    

    2. app/Models/User.php

    
    
      
      namespace App\Models;
        
      use Illuminate\Database\Eloquent\Factories\HasFactory;
      use Illuminate\Foundation\Auth\User as Authenticatable;
      use Illuminate\Notifications\Notifiable;
      use Laravel\Sanctum\HasApiTokens;
        
      class User extends Authenticatable
      {
          use HasFactory, Notifiable, HasApiTokens;
        
          /**
           * The attributes that are mass assignable.
           *
           * @var  array
           */
          protected $fillable = [
              'name',
              'email',
              'password',
          ];
        
          /**
           * The attributes that should be hidden for serialization.
           *
           * @var  array
           */
          protected $hidden = [
              'password',
              'remember_token',
          ];
        
          /**
           * Get the attributes that should be cast.
           *
           * @return  array
           */
          protected function casts(): array
          {
              return [
                  'email_verified_at' => 'datetime',
                  'password' => 'hashed',
              ];
          }
      }
    
      
      

    3. Add Product Table and Model

    
    php artisan make:migration create_products_table
    
    
    
        
        use Illuminate\Database\Migrations\Migration;
        use Illuminate\Database\Schema\Blueprint;
        use Illuminate\Support\Facades\Schema;
            
        return new class extends Migration
        {
            /**
             * Run the migrations.
             */
            public function up(): void
            {
                Schema::create('products', function (Blueprint $table) {
                    $table->id();
                    $table->string('name');
                    $table->text('detail');
                    $table->timestamps();
                });
            }
            
            /**
             * Reverse the migrations.
             */
            public function down(): void
            {
                Schema::dropIfExists('products');
            }
        };
    
        
    
        php artisan migrate
    

    4. app/Models/Product.php

    
        
    
      
      namespace App\Models;
        
      use Illuminate\Database\Eloquent\Factories\HasFactory;
      use Illuminate\Database\Eloquent\Model;
        
      class Product extends Model
      {
          use HasFactory;
        
          /**
           * The attributes that are mass assignable.
           *
           * @var  array
           */
          protected $fillable = [
              'name', 'detail'
          ];
      }
    
      

    5. routes/api.php

    
        
    
      
      use Illuminate\Http\Request;
      use Illuminate\Support\Facades\Route;
        
      use App\Http\Controllers\API\RegisterController;
      use App\Http\Controllers\API\ProductController;
         
      Route::controller(RegisterController::class)->group(function(){
          Route::post('register', 'register');
          Route::post('login', 'login');
      });
               
      Route::middleware('auth:sanctum')->group( function () {
          Route::resource('products', ProductController::class);
      });
    
      

    6. app/Http/Controllers/API/BaseController.php

    
     
      
      namespace App\Http\Controllers\API;
        
      use Illuminate\Http\Request;
      use App\Http\Controllers\Controller as Controller;
        
      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);
          }
      }
    
      

    7. app/Http/Controllers/API/RegisterController.php

    
    
       
       namespace App\Http\Controllers\API;
          
       use Illuminate\Http\Request;
       use App\Http\Controllers\API\BaseController as BaseController;
       use App\Models\User;
       use Illuminate\Support\Facades\Auth;
       use Validator;
       use Illuminate\Http\JsonResponse;
          
       class RegisterController extends BaseController
       {
           /**
            * Register api
            *
            * @return  \Illuminate\Http\Response
            */
           public function register(Request $request): JsonResponse
           {
               $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')->plainTextToken;
               $success['name'] =  $user->name;
          
               return $this->sendResponse($success, 'User register successfully.');
           }
          
           /**
            * Login api
            *
            * @return  \Illuminate\Http\Response
            */
           public function login(Request $request): JsonResponse
           {
               if(Auth::attempt(['email' => $request->email, 'password' => $request->password])){ 
                   $user = Auth::user(); 
                   $success['token'] =  $user->createToken('MyApp')->plainTextToken; 
                   $success['name'] =  $user->name;
          
                   return $this->sendResponse($success, 'User login successfully.');
               } 
               else{ 
                   return $this->sendError('Unauthorised.', ['error'=>'Unauthorised']);
               } 
           }
       }
    
       

    8. app/Http/Controllers/API/ProductController.php

    
    
       
       namespace App\Http\Controllers\API;
          
       use Illuminate\Http\Request;
       use App\Http\Controllers\API\BaseController as BaseController;
       use App\Models\Product;
       use Validator;
       use App\Http\Resources\ProductResource;
       use Illuminate\Http\JsonResponse;
          
       class ProductController extends BaseController
       {
           /**
            * Display a listing of the resource.
            *
            * @return  \Illuminate\Http\Response
            */
           public function index(): JsonResponse
           {
               $products = Product::all();
           
               return $this->sendResponse(ProductResource::collection($products), 'Products retrieved successfully.');
           }
       
           /**
            * Store a newly created resource in storage.
            *
            * @param    \Illuminate\Http\Request  $request
            * @return  \Illuminate\Http\Response
            */
           public function store(Request $request): JsonResponse
           {
               $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(new ProductResource($product), 'Product created successfully.');
           } 
          
           /**
            * Display the specified resource.
            *
            * @param    int  $id
            * @return  \Illuminate\Http\Response
            */
           public function show($id): JsonResponse
           {
               $product = Product::find($id);
         
               if (is_null($product)) {
                   return $this->sendError('Product not found.');
               }
          
               return $this->sendResponse(new ProductResource($product), 'Product retrieved successfully.');
           }
           
           /**
            * 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): JsonResponse
           {
               $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(new ProductResource($product), 'Product updated successfully.');
           }
          
           /**
            * Remove the specified resource from storage.
            *
            * @param    int  $id
            * @return  \Illuminate\Http\Response
            */
           public function destroy(Product $product): JsonResponse
           {
               $product->delete();
          
               return $this->sendResponse([], 'Product deleted successfully.');
           }
       }
    
       

    9. Create Eloquent API Resources

    
    php artisan make:resource ProductResource
    

    app/Http/Resources/ProductResource.php

    
    
      
      namespace App\Http\Resources;
        
      use Illuminate\Http\Request;
      use Illuminate\Http\Resources\Json\JsonResource;
        
      class ProductResource extends JsonResource
      {
          /**
           * Transform the resource into an array.
           *
           * @return  array
           */
          public function toArray(Request $request): array
          {
              return [
                  'id' => $this->id,
                  'name' => $this->name,
                  'detail' => $this->detail,
                  'created_at' => $this->created_at->format('d/m/Y'),
                  'updated_at' => $this->updated_at->format('d/m/Y'),
              ];
          }
      }
    
      

    2. Testing

    in the http request

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