Migrasi Dari Lumen Ke Laravel 9


Yudi Purwanto
Backend Dev
Migrasi Dari Lumen Ke Laravel 9

Pada artikel ini akan membahas tentang:

  1. Kenapa harus migrasi ?
  2. Ada apa di Laravel 9
  3. Bagaimana cara migrasi dari lumen ke laravel.

Disclaimer, Di sini penulis ingin menggaris bawahi, bahwa pada artikel ini studi kasunya adalah migrasi tentang apa yang ada pada Ebook Membangun Api Aplikasi Kasir dengan Lumen. Jadi, artikel ini lebih dikhususkan untuk para pembeli yang sudah membeli ebook tersebut.

Kenapa Harus Migrasi?

  • Tidak Begitu Cepat

    Salah satu pendukung terbesar untuk menggunakan Lumen adalah kinerjanya. Itu masih mengalahkan sebagian besar framework lain (termasuk Laravel). Namun, Laravel semakin cepat. Saya melihat dari benchmark terbaru Taylor Laravel 600 req/sec. Ini masih sepertiga dari apa yang digembar-gemborkan Lumen - sekitar 1900 req/sec.

    Meskipun demikian, saya yakin dengan pengoptimalan tambahan, seseorang dapat meningkatkan kinerja Laravel.

  • Komunitas

    Salah satu faktor terbesar dari pemilihan framework adalah besarnya komunitas. Kenapa demikian. Disaat kita mendapatkan masalah kita akan mudah bertanya pada komunitas untuk mencari solusi. Hal ini juga terbukti pada packagist terlihat laravel sudah didownload kurang lebih dari 25 Juta, sedangkan lumen sekitan 804 ribu, rasio 160 banding 1.

  • Fitur

    Lumen memiliki fitur yang kecil dibandingkan dengan laravel, memang fokus awal lumen ada untuk pengembangan API dan ini saya sangat setuju. Namun, seiring berkembangnya modul pada aplikasi yang kita bangun, maka kita mau tidak mau harus memilih antara bertahan atau rewrite aplikasi yang sudah ada ke versi Laravel.

  • Laravel + Octane

    Sejak hadirnya Octane, semakin kecil kemungkinan Lumen dipertahankan (hanya opini 😀).

    Laravel Octane meningkatkan kinerja aplikasi dengan menyajikan aplikasi kita menggunakan server aplikasi berdaya tinggi, menggunakan Open Swoole, Swoole, dan RoadRunner. lebih detilnya ada di https://laravel.com/docs/9.x/octane

Ada apa di laravel 9

  • Minimum menggunakan PHP versi 8
  • Desain baru php artisan routes:list
  • Test Coverage Option
  • Anonymous Stub Migrations
  • Query Builder Interface
  • PHP 8 String Functions
  • Moved mailer functionality from SwiftMailer to Symfony Mailer
  • Flysystem 3.x
  • Improved Eloquent Accessors & Mutators
  • Implicit Route Bindings With Enums
  • Controller Route Groups
  • Enum Eloquent Attribute Casting
  • dan masih banyak lagi, untuk lebih detilnya bisa dilihat di https://laravel-news.com/laravel-9-released

Bagaimana cara migrasi dari lumen ke laravel

Pada tahap ini ada beberapa poin yang perlu kita perhatikan

  1. Structure Aplikasi Sebelumnya (Lumen)

    Struktur Aplikasi Lumen

    Pada gambar di atas, structure aplikasi yang ada pada ebook seperti di atas, kita cukup fokus pada folder src. Karena yang akan kita pindah adalah isi dari aplikasi yang sudah kita buat dengan Lumen ke Laravel.

  2. Instalasi Laravel

    Pada tahap ini kita akan menggunakan Laravel Sail dan Docker wajib sudah terinstal di Laptop/PC kalian ya.

    • Mac

      Jika menggunakan Mac lakukan langkah-langkah seperti di bawah ini:

      • curl -s "https://laravel.build/example-app" | bash
      • cd example-app
      • ./vendor/bin/sail up
    • Linux & Windows (WSL)

      Jika menggunakan Linux dan Windows WSL lakukan langkah-langkah seperti di bawah ini:

      • curl -s https://laravel.build/example-app | bash
      • cd example-app
      • ./vendor/bin/sail up
    • example-app bisa kalian rubah dengan nama aplikasi.

    Jika perintah di atas berhasil dan berjalan normal. Maka, kita akan ke tahap pemindahan. dan Jika tidak ingin menggunakan Sail dan Docker kita juga bisa menggunakan Composer pada link berikut ini https://laravel.com/docs/9.x/installation#installation-via-composer, lalu bisa ketahap selanjutnya.

  3. Pemindahan Komponen-komponen

  • Pemindahan Model

    Pada tahap ini, kita akan memindahi isi dari folder app/Models yang ada pada aplikasi Lumen.

    Models

    Seperti yang terlihat pada gambar di atas, kita akan memindahi semua yang ada pada folder app/Models ke app/Models yang ada pada Laravel.

    Jika semua model sudah berpindah, maka kita akan melanjutkan ke Pemindahan Controller.

  • Pemindahan Controller

    Pada tahap ini, kita akan memindahi isi dari Folder app/Http/Controllers yang ada pada aplikasi Lumen.

    Controllers

    Seperti yang terlihat pada gambar di atas, kita akan memindahi Controller yang ada ke aplikasi Laravel. Controller.php g perlu di pindah ya.

  • Pemindahan Middleware

    Pada aplikasi lumen, kita pernah membuat 2 buah middleware yaitu RoleMiddleware.php dan UnacceptableMiddleware.php oleh sebab itu pindah 2 middleware tersebut ke aplikasi Laravel yang ada pada folder app/Http/Middleware.

  • Pemindahan Folder Utils

    Pada aplikasi lumen, kita pernah membuat sebuah helper JsonResponse.phpuntuk kebutuhan respon json. Jadi kita cukup pindah folder app/Utils ke folder app yang ada di Laravel.

  • Pemindahan File Config

    Pada aplikasi lumen, kita sudah membuat sebuah trait untuk kebutuhan pencarian. Pada folder config ada satu file searchable.php yang harus kita pindah ke config yang ada pada Laravel.

  • Pemindahan Migration

    Pada tahap ini, kita akan memindahi isi dari folder database/migrations yang ada pada aplikasi Lumen.

    Migrations

    Pada gambar di atas, ada 7 buah file yang harus kita pindah ke database/migrations aplikasi Laravel.

    • Catatan

      Hapus 2014_10_12_000000_create_users_table.php bawaan Laravel.

  • Pemindahan Factories

    Pada tahap ini, kita akan memindahi isi dari folder database/factories yang ada pada aplikasi Lumen.

    Factories

    Pada gambar di atas, ada 5 file yang harus kita pindah ke database/factories aplikasi Laravel.

  • Pemindahan Seeders

    Pada tahap ini, kita akan memindahi isi dari folder database/seeders yang ada pada aplikasi Lumen.

    Seeders

    Pada gambar di atas, ada 6 file yang harus kita pindah ke database/seeders aplikasi Laravel.

  1. Install Sanctum

    Kali ini kita menggunakan bawaan Laravel, yaitu Laravel Sanctum. Karena pada aplikasi lumen kita menggunakan JWT.

    Pada tahap ini, kita tidak perlu install Laravel Sanctum, karena secara default Laravel Sanctum sudah terinstal ketika kita mendownload Laravel itu sendiri.

    • Penyesuaian Model User.php

      Kali kita akan sedikit memberi perubahan pada Model User.php, kurang lebih perubahan akan seperti berikut ini

      <?php
      
      namespace App\Models;
      
      use Illuminate\Foundation\Auth\User as Authenticatable;
      use Illuminate\Database\Eloquent\Factories\HasFactory;
      use Laravel\Sanctum\HasApiTokens;
      
      class User extends Authenticatable
      {
          use HasFactory, HasApiTokens;
      
          protected $guarded = ['id'];
      
          protected $hidden = [
              'password',
          ];
      
          public function transactions()
          {
              return $this->hasMany(Transaction::class);
          }
      
          public function scopeHasRole($query, $role)
          {
              return $query->where('id', auth()->id())
                  ->where('role', $role);
          }
      }
      
    • Penyesuaian Controller AuthController.php

      Kali ini kita hanya fokus pada method login() dan logout() karena perubahan hanya terletak pada 2 method tersebut.

      <?php
      
      namespace App\Http\Controllers;
      
      use App\Http\Controllers\Controller;
      use Illuminate\Http\Response;
      use App\Utils\JsonResponse;
      
      class AuthController extends Controller
      {
          public function login()
          {
              $credentials = request(['email', 'password']);
      
              if (!auth()->attempt($credentials)) {
                  return response()->json(new JsonResponse(
                      'Login Gagal',
                      [],
                      'login_error'
                  ), Response::HTTP_UNAUTHORIZED);
              }
      
              $token = auth()->user()->createToken('API Token')->plainTextToken;
      
              return response()->json(new JsonResponse(
                  'Login berhasil',
                  [
                      'user' => auth()->user(),
                      'access_token' => $token,
                      'token_type' => 'bearer',
                      'expires_in' => config('sanctum.expiration')
                  ]
              ), Response::HTTP_OK);
          }
      
          public function me()
          {
              return response()->json(new JsonResponse(
                  'Me',
                  auth()->user()
              ), Response::HTTP_OK);
          }
      
          public function logout()
          {
              auth()->user()->tokens()->delete();
      
              return response()->json(new JsonResponse(
                  'Logout Berhasil',
                  []
              ), Response::HTTP_OK);
          }
      
      }
      
    • Edit config sanctum.php

      Silahkan buka file sanctum.php rubah pada bagian 'expiration' => null, menjadi seperti ini 'expiration' => 60 * 24 * 7,

  2. Penyesuaian Kernel.php

    Kali ini kita akan sedikit memberikan perubahan pada App/Http/Kernel.php

    <?php
    
    namespace App\Http;
    
    use Illuminate\Foundation\Http\Kernel as HttpKernel;
    
    class Kernel extends HttpKernel
    {
        /**
         * The application's global HTTP middleware stack.
         *
         * These middleware are run during every request to your application.
         *
         * @var array<int, class-string|string>
         */
        protected $middleware = [
            // \App\Http\Middleware\TrustHosts::class,
            \App\Http\Middleware\TrustProxies::class,
            \Fruitcake\Cors\HandleCors::class,
            \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
            \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
            \App\Http\Middleware\TrimStrings::class,
            \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
            \App\Http\Middleware\UnacceptableMiddleware::class,
        ];
    
        /**
         * The application's route middleware groups.
         *
         * @var array<string, array<int, class-string|string>>
         */
        protected $middlewareGroups = [
            'web' => [
                \App\Http\Middleware\EncryptCookies::class,
                \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
                \Illuminate\Session\Middleware\StartSession::class,
                // \Illuminate\Session\Middleware\AuthenticateSession::class,
                \Illuminate\View\Middleware\ShareErrorsFromSession::class,
                \App\Http\Middleware\VerifyCsrfToken::class,
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
            ],
    
            'api' => [
                // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
                'throttle:api',
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
            ],
        ];
    
        /**
         * The application's route middleware.
         *
         * These middleware may be assigned to groups or used individually.
         *
         * @var array<string, class-string|string>
         */
        protected $routeMiddleware = [
            'auth' => \App\Http\Middleware\Authenticate::class,
            'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
            'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
            'can' => \Illuminate\Auth\Middleware\Authorize::class,
            'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
            'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
            'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
            'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
            'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
            'role' => \App\Http\Middleware\RoleMiddleware::class,
        ];
    }
    
  3. Penyesuaian Routes

    Karena pada Lumen dan Laravel penulisan Route sangat berbeda. Maka, kita akan merubah total cara penulisannya. Namun, endpoint dan tujuannya akan tetap sama seperti versi pada Lumen. Silahkan buka file routes/api.php lalu sesuikan seperti kode berikut ini

    <?php
    
    use App\Http\Controllers\AuthController;
    use App\Http\Controllers\CategoryController;
    use App\Http\Controllers\DashboardController;
    use App\Http\Controllers\IncomeReportController;
    use App\Http\Controllers\ItemController;
    use App\Http\Controllers\TableController;
    use App\Http\Controllers\TransactionController;
    use Illuminate\Support\Facades\Route;
    
    Route::prefix('v1')->group(function () {
        Route::controller(AuthController::class)->group(function () {
            Route::post('/auth/login', 'login');
    
            Route::middleware('auth:sanctum')->group(function () {
                Route::get('/auth/me', 'me');
                Route::post('/auth/logout', 'logout');
            });
        });
    
        Route::middleware('auth:sanctum')->group(function () {
            Route::controller(CategoryController::class)->group(function () {
                Route::get('/categories', 'index');
                Route::get('/categories/{id}', 'show');
            });
            Route::controller(TableController::class)->group(function () {
                Route::get('/tables', 'index');
                Route::get('/tables/{id}', 'show');
            });
            Route::controller(TransactionController::class)->group(function () {
                Route::get('/items', 'index');
                Route::get('/items/{id}', 'show');
            });
            Route::controller(TransactionController::class)->group(function () {
                Route::get('/transactions', 'index');
                Route::get('/transactions/{id}', 'show');
            });
            Route::get('/dashboard',DashboardController::class);
            Route::get('reports/income-report', IncomeReportController::class);
        });
    
        Route::middleware(['auth:sanctum', 'role:kasir'])->group(function () {
            Route::controller(TransactionController::class)->group(function () {
                Route::post('/transactions', 'store');
                Route::put('/transactions/{id}', 'update');
                Route::delete('/transactions/{id}', 'destroy');
                Route::put('/transactions/{id}/status', 'updateStatus');
            });
        });
    
        Route::middleware(['auth:sanctum', 'role:admin'])->group(function () {
            Route::controller(CategoryController::class)->group(function () {
                Route::post('/categories', 'store');
                Route::put('/categories/{id}', 'update');
                Route::delete('/categories/{id}', 'destroy');
            });
            Route::controller(TableController::class)->group(function () {
                Route::post('/tables', 'store');
                Route::put('/tables/{id}', 'update');
                Route::delete('/tables/{id}', 'destroy');
            });
            Route::controller(ItemController::class)->group(function () {
                Route::post('/items', 'store');
                Route::put('/items/{id}', 'update');
                Route::delete('/items/{id}', 'destroy');
            });
        });
    
    });
    

Source Code: https://santrikoding.com/ebook/membangun-restful-api-aplikasi-kasir-dengan-lumen

Terima kasih

Membangun Restful API dengan Lumen - Studi Kasus Aplikasi Kasir: https://santrikoding.com/ebook/membangun-restful-api-aplikasi-kasir-dengan-lumen


Yudi Purwanto
Backend Dev

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami


ARTIKEL TERKAIT