Assalamualaikum wr.wb. Halo semuanya, seperti yang kita tau kini laravel telah rilis versi 9, tentunya ada beberapa perubahan dari versi sebelumnya. Apa saja perubahannya, mari kita bahas :
PHP 8
Laravel 9 kini menggunakan minimal PHP versi 8 sebagai dependensinya, hal ini tentu saja membuat kita dapat menggunakan fitur-fitur dari PHP 8 yang sebelumnya tidak dapat kita pakai di laravel versi sebelumnya.
Perubahan dependensi ini tidak serta merta tanpa alasan, karena laravel 9 menggunakan symfony 6.0 dimana symfony ini menggunakan PHP versi 8, tentunya hal ini yang membuat laravel 9 mengikuti langkah symfony untuk menggunakan php versi 8 sebagai dependensi.
Controller Route Group
Pada laravel 9 kita dapat mengelompokkan route yang mengarah pada controller yang sama, biasanya 1 controller dapat menjalankan beberapa method, contohnya index, store, create, edit, update, delete. Ketika kita menemukan kasus seperti itu, kita dapat menuliskan route group sebagai berikut :
use App\Http\Controllers\PostController;Route::controller(PostController::class)->group(function () {
Route::get('/post', 'index');
Route::get('/post/{id}', 'show');
Route::post('/post', 'store');
});
Rendering inline blade templates
Terkadang kita ingin merender template blade dengan data ke dalam format HTML. kita dapat menggunakan render yang disediakan oleh laravel 9 yang memanfaatkan blade facades. render menerima string template dan data parameter.
use Illuminate\Support\Facades\Blade;Route::get('/hello', function ($id) {
return Blade::render('Hello, {{ $name }}', ['name' => 'Alfa Riza']);
});
Bootstrap pagination view
Sejak laravel 8, default pagination untuk laravel menggunakan tailwind, namun jika kalian ingin menggunakan bootstrap versi 5, kalian dapat menambahkan code pada method boots di App\Providers\AppServiceProvider.
use Illuminate\Pagination\Paginator;/**
* Bootstrap any application services.
*
* @return void
*/public function boot()
{
Paginator::useBootstrapFive();
}
Sebagai catatan, laravel versi 8 belum mendukung paginasi untuk bootstrap versi 5
Symfony Mailer
Laravel 9 sekarang tidak lagi menggunakan library Swift Mailer dan menggantinya dengan library symfony Mailer. Jika pada aplikasi laravel kalian menggunakan mailgun atau postmark-mailer, kalian wajib menambahkan package tersebut via composer. Karena mengganti dari swift ke symfony, tentu saja synax juga harus disesuaikan dari swift ke symfony.
// Laravel 8.x...
$this->withSwiftMessage(function ($message) {
$message->getHeaders()->addTextHeader(
'Custom-Header', 'Header Value'
);
});// Laravel 9.x...
use Symfony\Component\Mime\Email;$this->withSymfonyMessage(function (Email $message) {
$message->getHeaders()->addTextHeader(
'Custom-Header', 'Header Value'
);
});
FileSystem 3x
Laravel 9 kini telah menggunakan filesystem 3.x dari yang sebelumnya menggunakan filesystem 1.x. Namun tidak perlu khawatir, pada dasarnya filesystem mendukung semua metode untuk memanipulasi file yang disediakan oleh facades.
Slot Name Shortcut
Pada versi sebelumnya, kita memberikan nama slot dengan menggunakan attribut name.
// Laravel 8
<x-alert>
<x-slot name="title">
Server Error
</x-slot>
<strong>Whoops!</strong> Something went wrong!
</x-alert>
pada laravel 9 kita dapat menggunakan shortcut.
<x-slot:title>
Server Error
</x-slot>
Checked / Selected directive blade
Ketika kita menggunakan checkbox atau select pada html, terkadang ada yang terselesct atau yang tercek. Pada laravel versi sebelumnya kita biasanya menggunakan if else atau operator ternary, namun pada laravel 9 kita dapat menggunakan @checked() dan @selected(). Contoh penggunaannya sebagai berikut :
checked directive blade
<input type="checkbox" name="status" value="active" @checked(old('status', $user->status)) />
selected directive blade
<select name="tag">
@foreach ($post->tags as $tag)
<option value="{{ $tag->id }}" @selected(old('tag') ==
$tag->id)> {{ $tag->name }} </option>
@endforeach
</select>
Improved Validation Of Nested Array Data
Terkadang kita perlu mengakses nilai pada nested array pada saat melakukan validasi. pada laravel 9 kita dapat melakukannya dengan method Rule::forEach.
use App\Rules\HasPermission;use Illuminate\Support\Facades\Validator;use Illuminate\Validation\Rule;$validator = Validator::make($request->all(), [
'companies.*.id' => Rule::forEach(function ($value, $attribute) {
return [
Rule::exists(Company::class, 'id'),
new HasPermission('manage-company', $value),
];
}),
]);
Laravel Breeze API & Next.js
Saat ini laravel 9 telah menyediakan laravel breeze starter kit yang mendukung next.js sebagai FrontEnd nya dan laravel sebagai BackEnd nya.
Improved Ignition Exception Page
Laravel 9 memiliki tampilan error yang baru, seperti gambar dibawah ini
Improved route:list
CLI Output
Laravel versi sebelumnya, jika kita ingin menampilkan route:list dengan cantik kita perlu menginstall library tambahan, namun pada laravel 9 tampilan route:list sudah cantik.
Anonymus Migration Classes
Laravel 9 kini menggunakan anonymous migration agar tidak membingungkan saat penamaan migration dan table.
Test Coverage Using Artisan test
Command
Fitur ini memungkinkan kita untuk melakukan semua test dengan waktu yang singkat, perintah artisan sebagai berikut
php artisan test --coverage
Kita juga dapat menambahkan parameter minimal berapa %
php artisan test --coverage --min=80.3
New Helpers
Laravel 9 terdapat 2 helpers baru yaitu str() dan to route_to(). Penggunaan str() untuk memanipulasi string sebagai berikut:
$slug = str('Alfa Riza')->slug();
Fungsi helper str() sama seperti Str::
Sedangkan fungsi route_to() berguna untuk mengalihkan ke route tertentu.
return to_route('users.show', ['user' => 1]);
Forced Scoping Of Route Bindings
jika kita memiliki 2 model yang memiliki hubungan one to many, misalnya users one to many posts, jadi 1 user dapat memiliki banyak post. Lalu kita memiliki route dimana route tersebut dengan scope jika user_id pada table posts sama dengan id pada table users.
// Laravel 8
use App\Models\Post;
use App\Models\User;Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});
penerapan scoping route
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
})->scopeBindings();
Enum Eloquent Attribute Casting
Pada migration, ketika kita memiliki column enum dengan beberapa nilai, namun pada pertengahan project kita ingin menambahkan nilai pada enum, kita tidak dapat serta merta mengubah file migration, lalu migrasi ulang. Laravel 9 mengatasi masalah tersebut dengan menyimpan value enum tersebut pada file terpisah, sehingga kita dapat melakukan perubahan nilai pada enum kapanpun.
kita simpan pada App\Enums untuk menyimpan nilai enum, cara mendefinisikan nilai enum sebagai berikut :
enum Status:string
{
case Active = 'active';
case InActive = 'inactive';
}
dan pada file migration kita, buat type datanya string. Namun pada Model kita definisikan $casts seperti dibawah ini :
use App\Enums\UserStatus;/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'status' => UserStatus::class,
];
Ketika kita sudah mendefinisikan pada model, maka kita dapat menggunakannya
if ($user->status == UserStatus::active) {
$user->status = UserStatus::inactive;
$user->save();
}
Kita juga dapat menggunakan casting pada route sebagai wildcard untuk mendapatkan nilainya,
Route::get('/users/{users}', function (User $user) {
return $user->status->value;
});
Improved Eloquent Accessors / Mutators
Laravel versi sebelumnya, kita mendefinisikan accessors and mutators pada model seperti dibawah ini :
public function getNameAttribute($value)
{
return strtolower($value);
}public function setNameAttribute($value)
{
$this->attributes['name'] = $value;
}
Pada laravel 9, kita dapat mendefinisikan lebih singkat sebagai berikut :
use Illuminate\Database\Eloquent\Casts\Attribute;public function name(): Attribute
{
return new Attribute(
get: fn ($value) => strtoupper($value),
set: fn ($value) => $value,
);
}
Okey, sekian dari saya terimakasih :)