Jumat, 19 January 2024

Apa yang Baru di Laravel 11

Laravel 11 membawa revolusi dalam framework PHP. Pelajari tentang fitur-fiturnya, perubahan, dan bagaimana mereka mengoptimalkan coding kita.

Laravel

Intro

Dalam artikel ini, kita akan membahas apa saja yang terbaru dalam Laravel 11 yang akan dirilis pada bulan Februari tahun ini.

PHP Version

Untuk menjalankan Laravel 11 ini kita memerlukan php paling rendah itu v8.2, artinya jika sekarang Anda sedang memakai v8.3 itu tentu bisa.

Instalasi Laravel 11

Jika Anda membaca artikel ini sebelum rilis, Anda bisa melakukan instalasi menggunakan Laravel CLI dengan flag --dev atau melalui Composer.

Terminal
laravel new laravel-11 --dev

Atau Anda bisa melakukannya dengan composer dengan menjalankan perintah berikut

Terminal
composer create-project --prefer-dist laravel/laravel laravel-11 dev-master

Dengan begitu, Anda akan mendapatkan early project untuk laravel 11.

Halaman "Welcome" Berubah

Bagi beberapa orang ini tidak terlalu penting, namun ya ini harus diberi tahu juga, bahwa laravel sekarang sudah memperbarui welcome page nya.

new laravel welcome page parsinta.com

Http atau Kernel Dihapus

Untuk Anda yang sudah familiar dengan penggunaan kernel, seperti dalam pendaftaran middleware, kabar baiknya kini Anda dapat melakukan hal tersebut secara langsung melalui direktori /bootstrap/app.php.

bootstrap/app.php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure()
    ->withProviders()
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        // api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        // channels: __DIR__.'/../routes/channels.php',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

Console Kernel Dihapus

Untuk file app/Console/Kernel.php sekarang sudah tidak ada lagi:

app/Console/Kernel.php
namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel

Itulah mengapa Laravel membuat routes/console.php tersedia secara default; nantinya, semua yang dilakukan di sini, seperti menjalankan schedule, akan dipindahkan ke route console tersebut.

app/Console/Kernel.php
protected function schedule(Schedule $schedule): void
{
    $schedule->command('backup:clean')->daily()->at('03.00');

Default Route

Sekarang, route hanya ada dua, yaitu console.php dan web.php. Namun, jika Anda ingin memiliki route lain seperti channels.php dan api.php, Anda bisa membuatnya sendiri, atau menggunakan perintah artisan seperti:

Terminal
# api
php artisan install:api

# channel
php artisan install:broadcasting

Setelah itu, maka kita bisa menghilangkan komentar pada file bootstrap/app.php yaitu:

bootstrap/app.php
return Application::configure()
    ->withProviders()
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        channels: __DIR__.'/../routes/channels.php',
    )
    ->withMiddleware(...)
    ->withExceptions(...)->create();

Dengan begitu, maka route untuk api dan channels akan terbaca pada project kita.

Model Cast

Dulunya, ketika ingin casting column pada model, yang kita lakukan adalah seperti:

app/Models/User.php
protected $casts = [
    'email_verified_at' => 'datetime',
    'password' => 'hashed',
];

Sekarang itu sudah berubah menjadi seperti:

app/Models/User.php
protected function casts(): array
{
    return [
        'email_verified_at' => 'datetime',
        'password' => 'hashed',
    ];
}

Alasan perubahan ini dibuat adalah untuk memberikan kita fleksibilitas lebih dalam menggunakan casting ini. Kita bisa melakukan berbagai hal tambahan, seperti mengimplementasikan class atau function lain seperti:

app/Models/User.php
protected function casts(): array
{
    return [
        'email_verified_at' => 'datetime',
        'password' => 'hashed',
        'options'=› AsEnumCollection::of(UserOption::class),
    ];
}

Dumpable Trait

Hal ini bertujuan untuk menyederhanakan inti framework karena beberapa kelas saat ini memiliki metode dd atau dump. Dan juga kita dapat menggunakan trait Dumpable ini di kelas yang kita punya:

class Carbon extends BaseCarbon
{
    use Conditionable, Dumpable;

Sehingga kita bisa melakukan hal-hal seperti:

today()->dd();

Bahkan kita bisa juga menggunakan trait ini pada class yang kita punya termasuk model-model yang kita punya nantinya.

Controller

Controller.php sekarang tidak lagi bergantung pada BaseController.php, jadi jika Anda perhatikan sekarang, isi dari Controller.php cukup sederhana.

../../Controllers/Controller.php
abstract class Controller
{
    //
}

Minim App

Jika Anda perhatikan folder app, yang dulunya ini sangat banyak di dalamnya namun sekarang hanya tinggal 3 files dan 4 folders.

app
├── Http
│   └── Controllers
│       ├── Controller.php
├── Models
│   └── User.php
└── Providers
    └── AppServiceProvider.php

Perubahan Pada Direktori Config

Sebelumnya, folder config ini akan di huni dengan semua config yang ada dan itu default di bawa oleh skeleton yang lama. Yang mana terkadang config itu tidak penting, dan bahkan ada beberapa yang tidak pernah kita robah. Nah untuk itu, di versi 11 ini config yang dibawa yaitu config yang umum dirobah saja. Berikut adalah list file config yang nanti akan di bawa laravel 11

config
├── app.php
├── auth.php
├── cache.php
├── database.php
├── filesystems.php
├── logging.php
├── mail.php
├── queue.php
├── services.php
└── session.php

Namun, jika kita ingin config yang lain, kita tentu bisa menjalankan perintah artisan seperti:

php artisan config:publish

Dengan begitu, maka output yang keluar menanyakan config apa yang ingin kita publish. Sebagai contoh, saya akan memilih config untuk services.

Maka output nya akan seperti:

 ┌ Which configuration file would you like to publish? ─────────┐
 │ services                                                     │
 └──────────────────────────────────────────────────────────────┘

   INFO  Published 'services' configuration file.

Dengan begitu, maka services.php akan sudah ada dalam folder config.

config
└── services.php

0 directories, 1 file

Slim Migration

Untuk project yang dimulai dengan laravel 11, maka hanya akan ada 3 file migration saja yang dibawa by default yaitu.

database/migrations
├── 0001_01_01_000000_create_users_table.php
├── 0001_01_01_000001_create_cache_table.php
└── 0001_01_01_000002_create_jobs_table.php

0 directories, 3 files

Saat saya menulis ini, ada migrasi untuk cache, dan bisa jadi nantinya hanya akan ada 2 saja.

Sebelumnya, ada migrasi untuk reset_tokens dan personal_access_tokens, namun kini itu tidak ada lagi. Berikut adalah daftar migrasi sebelum v11.

database/migrations
├── 2014_10_12_000000_create_users_table.php
├── 2014_10_12_100000_create_password_reset_tokens_table.php
├── 2019_08_19_000000_create_failed_jobs_table.php
└── 2019_12_14_000001_create_personal_access_tokens_table.php

0 directories, 4 files

Integrasi Package Lain

Laravel 11 akan terintegrasi dengan package yang dibuat oleh Jonas Staudenmeir, memudahkan kita dalam mengatur query yang digunakan dalam eager loading.

User::query()->select('id', 'name')->with([
    'statuses' => fn($query) => $query->take(5)
])->get();

New Artisan Make

Ada beberapa tambahan untuk perintah artisan make di antaranya ada make:enum dan juga make:trait.

Artisan Make Enum

Di versi laravel 11 ini, mereka menambahkan perintah artisan baru yaitu make:enum.

Terminal
php artisan make:enum ArticleStatus

By default, file akan masuk ke dalam folder app, namun untuk membuat struktur lebih bagus, yang biasa saya lakukan adalah membuat enum kedalam namespace App\Enums.

php artisan make:enum Enums/ArticleStatus

Dengan begitu, maka file akan masuk kedalam folder app/Enums.

Untuk tambahan atau flag yang bisa kita lakukan adalah -i untuk integer, atau -s untuk string.

Terminal
php artisan make:enum Enums/ArticleStatus -s

Dengan begitu, maka file akan langsung menentukan tipe datanya seperti:

namespace App\Enums;

enum ArticleStatus: string
{
    //
}

Artisan Make Trait

Sama seperti enum, by default perintah make:trait juga akan masuk kedalam ke folder app, namun jika ingin membuat namespace nya ke App/Traits. Bisa dengan perintah berikut:

php artisan make:trait Traits/Sluggable

Dengan begitu, maka akan otomatis file akan masuk kedalam folder app/Traits.

app/Traits/Sluggable.php
namespace App\Traits;

enum Sluggable
{
    //
}

Dari v10 ke v11

Beberapa direktori mengalami perubahan di Laravel versi 11, namun proses upgrade dari versi 10 ke 11 tidak memerlukan modifikasi apa pun. Untuk melakukan upgrade, cukup ubah versi di file composer.json dan pastikan kompatibilitas dengan third-party package yang digunakan.

Kesimpulan

Bagi Anda yang telah lama menggunakan Laravel, Anda akan merasa nyaman karena perubahan yang terjadi tidak terlalu signifikan, dan esensi utama dari framework ini tetap sama. Hal-hal seperti mendefinisikan relasi dan routing masih berjalan seperti biasa.

Dari serangkaian pembaruan mulai dari v5 hingga v10, kali ini adalah momen istimewa dimana Laravel menghadirkan versi yang dikenal sebagai Slim Skeleton. Versi ini dirancang untuk membuatnya lebih mudah bagi pemula untuk memulai petualangan mereka dengan Laravel.

Saya harap artikel ini memberikan wawasan yang bermanfaat bagi Anda. Jangan lupa untuk membagikannya kepada teman-teman Anda, sehingga mereka juga dapat mendapatkan informasi ini. Saya Irsyad, sampai bertemu di lain waktu.