T</>TahuCoding

Tutorial CRUD REST API pada Laravel 10

Loading...

Ingin membuat REST API menggunakan Laravel 10 untuk aplikasi webmu?, kamu berada di tempat yang tepat. Dalam tutorial ini, kamu akan belajar cara membuat CRUD REST API (CREATE, READ, UPDATE, dan DELETE) menggunakan Laravel 10 dengan Auth Passport.

Dalam tutorial ini, kamu akan memahami cara membuat CRUD REST API yang powerfull dan aman menggunakan fitur-fitur Laravel dan mengujinya menggunakan aplikasi Postman.

Step 1: Buat Project Laravel 10

Pertama-tama, buka cmd/terminal.

Kemudian jalankan perintah berikut untuk mendownload dan menginstall project Laravel 10:

composer create-project laravel/laravel rest-api-example

Step 2: Setup Database

Setelah menginstall project Laravel, mari konfigurasi database terlebih dahulu.

Buka file .env. Lalu tambahkan detail database sebagai berikut:

.env
 DB_CONNECTION=mysql
 DB_HOST=127.0.0.1
 DB_PORT=3306
 DB_DATABASE=nama databasemu
 DB_USERNAME=username databasemu
 DB_PASSWORD=password databasemu

Step 3: Install Laravel Passport

Setelah berhasil konfigurasi database, sekarang jalankan perintah berikut di cmd/terminal untuk menginstal package Laravel Passport:

composer require laravel/passport

Setelah berhasil menginstall package Laravel Passport, mari konfigurasi config laravel agar dapat load PassportServiceProvider.

Buka file config/app.php lalu tambahkan kode berikut:

config/app.php
'providers' => [
    Laravel\Passport\PassportServiceProvider::class,
],

Sebelum itu lakukan migration agar tabel-tabel yang dibutuhkan dibuat pada databasemu:

php artisan migrate

Kemudian jalankan perintah berikut untuk menghasilkan kunci enkripsi Passport yang diperlukan untuk menghasilkan token akses yang aman:

php artisan passport:install

Step 4: Setup Model User

Pada langkah ini, pindah ke direktori app/Models dan buka file User.php. Kemudian perbarui kode berikut di dalam file User.php:

app/Models/User.php
<?php
 
namespace App\Models;
 
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
 
class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
 
    /**
     * 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"];
 
    /**
     * The attributes that should be cast.
     *
     * @var array
     */
    protected $casts = [
        "email_verified_at" => "datetime",
        'password' => 'hashed',
    ];
}
 

Selanjutnya, pindah ke config/auth.php dan buka file auth.php. Kemudian ubah driver API menjadi passport:

config/auth.php
[
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

Step 5: Buat Migration dan Model

Pada langkah ini, buka cmd/terminal dan jalankan perintah berikut untuk membuat model produk dan file migrasi:

php artisan make:model Product -m

Setelah itu, navigasikan ke direktori database/migrations dan buka file create_products_table.php. Kemudian perbarui kode berikut di dalamnya:

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

Kemudian tambahkan properti fillable di file product.php. Navigasikan ke direktori app/Models dan buka file product.php, kemudian perbarui kode berikut di dalamnya:

app/Models/Product.php
<?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'
    ];
}

Step 6: Jalankan Migration

Pada langkah ini, kamu perlu melakukan database migration agar table products terbuat pada databasemu:

php artisan migrate

Step 7: Buat Eloquent API Resources

Buatlah Eloquent API Resources agar membantumu membuat tata letak response yang sama dari objek modelmu. Buatlah dengan menggunakan perintah berikut:

php artisan make:resource ProductResource
app/Http/Resources/ProductResource.php
<?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'),
        ];
    }
}

Step 8: Buat Controller

Pada langkah selanjutnya, buatlah folder baru bernama "API" di dalam folder Controllers agar struktur API terpisah, kemudian buat file BaseController.php pada folder API:

app/Http/Controllers/API/BaseController.php
<?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);
    }
}

Pada langkah ini, buat controller RegisterController.php dan ProductController.

Buka cmd/terminal lalu jalankan perintah berikut:

 php artisan make:controller Api\RegisterController
 php artisan make:controller Api\ProductController

Setelah itu, buat beberapa method autentikasi di RegisterController.php. Masuk ke direktori app/Http/controllers/API dan buka file RegisterController.php. Kemudian perbarui RegisterController.php menjadi berikut:

app/Http/controllers/API/RegisterController.php
<?php
 
namespace App\Http\Controllers\API;
 
use App\Http\Controllers\API\BaseController as BaseController;
use Illuminate\Http\Request;
use App\Models\User;
 
class RegisterController extends BaseController
{
    /**
     * Registration Req
     */
    public function register(Request $request)
    {
        $this->validate($request, [
            'name' => 'required|min:4',
            'email' => 'required|email',
            'password' => 'required|min:8',
        ]);
 
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);
 
        $token = $user->createToken('RandomKeyPassportAuth')->accessToken;
 
        return $this->sendResponse(['token' => $token], 'Registered successfully.');
    }
 
    /**
     * Login Req
     */
    public function login(Request $request)
    {
        $data = [
            'email' => $request->email,
            'password' => $request->password
        ];
 
        if (auth()->attempt($data)) {
            $token = auth()->user()->createToken('RandomKeyPassportAuth')->accessToken;
            return $this->sendResponse(['token' => $token], 'Registered successfully.');
        } else {
            return $this->sendError(['error' => 'Unauthorised'], "Login Failed". 401);
        }
    }
 
    public function userInfo()
    {
     $user = auth()->user();
 
     return $this->sendResponse(['user' => $user], 'User retrieved successfully.');
    }
}

Selanjutnya, buat method CRUD di ProductController.php. Pindah ke direktori app/Http/controllers/API dan buka file ProductController.php. Kemudian, perbarui file ProductController.php sebagai berikut:

app/Http/controllers/API/ProductController.php
<?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 db.
     *
     * @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 db.
     *
     * @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 db.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy(Product $product): JsonResponse
    {
        $product->delete();
 
        return $this->sendResponse([], 'Product deleted successfully.');
    }
}

Step 9: Definisikan Routes

Pada langkah ini, buat route auth dan operasi CRUD REST API.

Lalu pindah ke direktori routes dan buka api.php. Kemudian perbarui route berikut di dalam file api.php:

routes/api.php
<?php
 
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
 
use App\Http\Controllers\API\RegisterController;
use App\Http\Controllers\API\ProductController;
 
/*
|--------------------------------------------------------------------------
| 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', [RegisterController::class, 'register']);
Route::post('login', [RegisterController::class, 'login']);
 
Route::middleware('auth:api')->group( function () {
    Route::get('user', [RegisterController::class, 'userInfo']);
    Route::resource('products', ProductController::class);
});

Step 10: Test Project pada Postman

Kemudian buka cmd/terminal dan jalankan perintah berikut untuk memulai server dev Laravel:

 php artisan serve

Buka aplikasi Postman dan panggil API CRUD dan autentikasi yang telah dibuat di aplikasi Postman: sebagai berikut:

Berikut adalah URL Route dengan REST API Verb:

  1. Register: Verb: GET, URL: http://localhost:8000/api/register
Postman Register API
  1. Login: Verb: GET, URL: http://localhost:8000/api/login
Postman Login API

Pastikan pada detail API kita menggunakan header berikut:

'headers' => [
    'Accept' => 'application/json',
    'Authorization' => 'Bearer '.$accessToken,
]
  1. Product List : Verb: GET, URL: http://localhost:8000/api/products
Postman Get Products API
  1. Product Create: Verb: POST, URL: http://localhost:8000/api/products
Postman Create Product API
  1. Product Show: Verb: GET, URL: http://localhost:8000/api/products/{id}
Postman Get Product API
  1. Product Update: Verb: PUT, URL: http://localhost:8000/api/products/{id}
Postman Update Product API
  1. Product Delete: Verb: DELETE, URL: http://localhost:8000/api/products/{id}
Postman Delete Products API
  1. Info User Login: Verb: DELETE, URL: http://localhost:8000/api/user
Postman Get User API