Apa yang baru di Laravel 9

AlfaRiza
5 min readFeb 9, 2022

--

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

error laravel 9

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.

route:list

Anonymus Migration Classes

Laravel 9 kini menggunakan anonymous migration agar tidak membingungkan saat penamaan migration dan table.

anonymous migration

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 :)

--

--

AlfaRiza
AlfaRiza

No responses yet