Pada artikel ini akan membahas tentang:
- Kenapa harus migrasi ?
- Ada apa di Laravel 9
- 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
-
Structure Aplikasi Sebelumnya (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. -
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.
-
-
Pemindahan Komponen-komponen
-
Pemindahan Model
Pada tahap ini, kita akan memindahi isi dari folder
app/Models
yang ada pada aplikasi Lumen.Seperti yang terlihat pada gambar di atas, kita akan memindahi semua yang ada pada folder
app/Models
keapp/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.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
danUnacceptableMiddleware.php
oleh sebab itu pindah 2 middleware tersebut ke aplikasi Laravel yang ada pada folderapp/Http/Middleware
. -
Pemindahan Folder
Utils
Pada aplikasi lumen, kita pernah membuat sebuah helper
JsonResponse.php
untuk kebutuhan respon json. Jadi kita cukup pindah folderapp/Utils
ke folderapp
yang ada di Laravel. -
Pemindahan File Config
Pada aplikasi lumen, kita sudah membuat sebuah
trait
untuk kebutuhan pencarian. Pada folderconfig
ada satu filesearchable.php
yang harus kita pindah keconfig
yang ada pada Laravel. -
Pemindahan Migration
Pada tahap ini, kita akan memindahi isi dari folder
database/migrations
yang ada pada aplikasi Lumen.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.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.Pada gambar di atas, ada 6 file yang harus kita pindah ke
database/seeders
aplikasi Laravel.
-
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()
danlogout()
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,
-
-
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, ]; }
-
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
Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami