-
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
-
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
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.
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.php
untuk 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.
Pada gambar di atas, ada 7 buah file yang harus kita pindah ke database/migrations
aplikasi 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()
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,
-
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');
});
});
});