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.

    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.

    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
    

    Direktori Config Kosong

    Jika Anda lihat folder config, maka Anda akan terkejut terheran-heran, karena tidak ada lagi file-file yang biasanya kita lihat seperti:

    config
    ├── app.php
    ├── auth.php
    ├── backup.php
    ├── broadcasting.php
    ├── cache.php
    ├── cors.php
    ├── database.php
    ├── disposable-email.php
    ....
    

    Namun, jika kita ingin melakukan perubahan itu, 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.

    Karteil
    Destinasi Utama Belajar Online dengan Format Tulisan yang Elegan
    Kunjungi Sekarang

    Irsyad A. Panjaitan

    Let's start living like no one can help us in any event, so that when we are helped in certain times, it becomes a plus in itself.

    Go to Irsyad A. Panjaitan profile
    Support me
    SaweriaGithub