Minggu, 05 February 2023

Apa Yang Baru Di Laravel 10 Dan Ekosistem nya

Dalam artikel kali ini kita akan membahas apa saja yang terbaru dalam laravel dan juga ekosistem nya.

Laravel
Released

Dalam artikel kali ini kita akan membahas apa saja yang terbaru dalam laravel v10 dan juga ekosistem nya.

Laravel 9.49

Sejak laravel versi ini rilis, kita bisa membuat perintah make:model tanpa memberikan namanya, walaupun sebenarnya bisa dengan memasukkan nama atau flag nya.

Model

Berikut ini adalah perintah ketika kita ingin membuat model untuk Product.

php artisan make:model

Ketika kita enter, dulu nya ini akan error, namun sekarang tidak. Karena dia sudah akan langsung bertanya apa nama model kita. Kurang lebih akan seperti ini jika kita terus enter.

  What should the model be named?
❯ Product

  Would you like any of the following? [none]
  none ........... ..............0
  all .......................... 1
  factory ........... ...........2
  form requests ........... .....3
  migration ........... .........4
  policy ........... ............5
  resource controller ...........6
  seed  .........................7
❯ 4

   INFO  Model [app/Models/Product.php] created successfully.

   INFO  Migration [database/migrations/2023_02_05_095212_create_products_table.php] created successfully.

Controller

Sama dengan model, controller juga akan seperti itu. Kita tetap akan di tanya ketika hanya membuat artisan untuk make:controller.

php artisan make:controller

Selanjutnya, dia akan memberi pertanyaan seputar opsi yang diberikan default controller seperti: api, invokable, resource, singleton atau bahkan tidak ada sama sekali, kita bisa pilih empty.

What should the controller be named?
❯ ProductController

  Which type of controller would you like: [empty]
  empty ............................ 0
  api............................... 1
  invokable ........................ 2
  resource ......................... 3
  singleton ........................ 4
❯ 3

  What model should this resource controller be for? [none]
❯ Product

   INFO  Controller [app/Http/Controllers/ProductController.php] created successfully.

Bahkan sebenarnya tidak hanya itu, semua perintah yang berbentuk make akan selalu bertanya terkait nama maupun opsi yang di tawarkannya.

Make

Jika kalian ingin tahu apa-apa saja perintah untuk make, kita bisa lakukan perintah list diikuti dengan key nya seperti:

php artisan list make

Maka harusnya akan muncul daftar perintah make seperti berikut:

make:cast          Create a new custom Eloquent cast class
make:channel       Create a new channel class
make:command       Create a new Artisan command
make:component     Create a new view component class
make:controller    Create a new controller class
make:event         Create a new event class
make:exception     Create a new custom exception class
make:factory       Create a new model factory
make:job           Create a new job class
make:listener      Create a new event listener class
make:mail          Create a new email class
make:middleware    Create a new middleware class
make:migration     Create a new migration file
make:model         Create a new Eloquent model class
make:notification  Create a new notification class
make:observer      Create a new observer class
make:policy        Create a new policy class
make:provider      Create a new service provider class
make:request       Create a new form request class
make:resource      Create a new resource
make:rule          Create a new validation rule
make:scope         Create a new scope class
make:seeder        Create a new seeder class
make:test          Create a new test class

Laravel Breeze

Ketika kita lakukan instalasi breeze, pastinya kita akan melakukan perintah breeze:install, tanpa kita beri flag seperti --ssr, --pest, atau ssr. Dia akan default menggunakan blade. Namun sekarang, itu tidak perlu kita khawatirkan jika keburu ke enter.

Pertama sekali, mari kita lakukan instalasi breeze nya dengan composer

composer require laravel/breeze

Setelah itu, mari kita jalankan perintah breeze:intall seperti berikut:

php artisan breeze:install

Dan harusnya, akan muncul beberapa pertanyaan seperti:

Which stack would you like to install?
  blade ...................... 0
  react ...................... 1
  vue ........................ 2
  api ........................ 3
❯ 1

  Would you like to install dark mode support? (yes/no) [no]
❯ no

  Would you like to install Inertia SSR support? (yes/no) [no]
❯ yes

  Would you prefer Pest tests instead of PHPUnit? (yes/no) [no]
❯ yes

./composer.json has been updated

Secara personal, saya sering lupa untuk menambahkan flag pest. Jadi harusnya dengan fitur ini, saya tidak perlu khawatir lagi karena sudah di ingatkan.

Laravel Horizon

Untuk update kali ini juga sangat kren, salah satunya adalah warna untuk dark pada horizon sudah di perbaiki. Jadi tampilan sudah lebih mantap dari pada sebelumnya. Tambah lagi ada menu tambahan yaitu Silenced Jobs.

Horizon

Laravel Telescope

Sama dengan horizon, kali ini telescope juga mendapat update untuk design dan juga ada tambahan menu nya. Anda bisa langsung mencoba package ini, karena saya sendiri juga memakai nya.

Laravel New Command

Pastikan Anda sudah memakai laravel installer versi yang terbaru yaitu v4.4.0, untuk memeriksanya, bisa dengan menjalakan perintah berikut:

laravel --version

Nah jika belum menggunakan versi terakhir, atau belum memperbarui nya, silakan perbarui dengan menjalankan perintah berikut:

composer global update laravel/installer

Setelah itu, jika sekarang kita buat jalankan perintah laravel help new, maka outputnya harus seperti:

--dev                        Installs the latest "development" release
--git                        Initialize a Git repository
--branch=BRANCH              The branch that should be created for a new repository [default: "master"]
--github[=GITHUB]            Create a new repository on GitHub [default: false]
--organization=ORGANIZATION  The GitHub organization to create the new repository for
--breeze                     Installs the Laravel Breeze scaffolding
--dark                       Indicate whether Breeze should be scaffolded with dark mode support
--ssr                        Indicate whether Breeze should be scaffolded with Inertia SSR support
--jet                        Installs the Laravel Jetstream scaffolding
--stack[=STACK]              The Breeze / Jetstream stack that should be installed
--teams                      Indicates whether Jetstream should be scaffolded with team support
--pest                       Installs the Pest testing framework
--prompt-breeze              Issues a prompt to determine if Breeze should be installed
--prompt-jetstream           Issues a prompt to determine if Jetstream should be installed

Jika di perhatikan baik-baik, opsi baru disini yaitu --dark, --breeze, --ssr dan --pest. Yep, opsi ini baru datang di laravel installer versi terbaru. Jadi intinya, jika Anda ingin membuat project baru dengan breeze, tidak perlu lagi memulainya dengan instalasi laravel, kemudian package breeze nya.

Karena sekarang, kita sudah bisa menggunakan opsi --breeze untuk membuat scaffolding project nya. Sebagai contoh, disini saya akan membuat project dengan scaffolding breeze react dengan ssr dan juga pest. Biar lebih complit, kita akan tambah juga mode gelapnya. Maka yang saya jalankan kurang lebih akan seperti ini:

laravel new typo --breeze --dark --stack=react --pest --ssr

Maka harusnya, sekarang kurang lebih outputnya akan sudah seperti ini:

  ____
 | __ ) _ __ ___  ___ _______
 |  _ \| '__/ _ \/ _ \_  / _ \
 | |_) | | |  __/  __// /  __/
 |____/|_|  \___|\___/___\___|
 Creating a "laravel/laravel" project at "./typo"

Yang artinya, dengan satu command tersebut, kita sudah bisa mendapatkan scaffolding sesuai yang kita inginkan.

Sanctum Expired Column

Laravel sanctum sekarang sudah v3.2 dengan fitur tambahan yaitu expired. Jadi ketika Anda sudah menggunakan sanctum v2, silakan upgrade ke v3.2. Dan pastinya, untuk mengaktifkan fitur ini, kita perlu membuat 1 migration untuk menambahkan kolom ke table pat.

artisan make:migration 'add expired_at to personal_access_tokens table'

Buka file nya dan masukkan script berikut ini:

Schema::table('personal_access_tokens', function (Blueprint $table) {
    $table->timestamp('expires_at')->nullable()->after('last_used_at');
});

Processes

Laravel menyediakan API minimal yang ekspresif di sekitar komponen Proses Symfony, memungkinkan Anda untuk dengan mudah memanggil proses eksternal dari aplikasi Laravel Anda.

Ada 2 metode yang paling penting disini yaitu run dan start. Yang mana run akan menjalankan proses sampai eksekusi selesai, sementara start digunakan untuk proses yang bersifat asynchronous.

Untuk fitur ini saya sendiri sudah pernah test, ketika saja menjalan mfs saya juga ingin semua image yang sudah di masukkan storage juga ikut ter refresh. Nah untuk itu, yang saya lakukan kurang lebih akan seperti ini:

if (app()->environment('local')) {
    Process::run('rm -rf storage/app/public')->output();

    User::factory(20)->create();
    $this->call([
        StoreSeeder::class,
        ProductSeeder::class,
        ReviewSeeder::class,
        ColorSeeder::class,
        SizeSeeder::class,
    ]);
}

Dengan begitu, maka ketika saya lakukan perintah

artisan migrate:fresh --seed

maka semua file yang ada di storage/app/public akan ikut terhapus. Jika Anda ingin melihat hasil dari setiap proses yang di jalankan, itu sangat mudah sekali.

$result = Process::run('ls -la');
 
$result->successful(); // Perintah berhasil
$result->failed(); // Perintah jika error
$result->exitCode(); // Error dan langsung keluar dari proses
$result->output(); // Untuk memperlihatkan output
$result->errorOutput(); // Untuk memperlihatkan error

Untuk throw exceptionnya mudah saja dengan:

$result = Process::run('ls -la')->throw();
 
$result = Process::run('ls -la')->throwIf($condition);

Untuk melihat semua api nya, bisa langsung cek disini.

Laravel Pennant

First-party package yang dibuat oleh salah satu core team Laravel. Ini sangat berguna bagi kita yang sedang ingin menambahkan fitur kepada website kita, namun kita tidak ingin semua orang melihat ini. Melainkan user-user yang kita pilih saja.

Untuk menggunakannya, kita perlu menginstal package nya terlebih dahulu, karena tidak include sewaktu kita install laravel nya.

composer require laravel/pennant

Kemudian silakan publish vendor nya, karena dia nantinya akan memberikan file migration untuk kita.

php artisan vendor:publish --provider="Laravel\Pennant\PennantServiceProvider"

Setelah itu, silakan lakukan artisan migrate. Yang mana dia akan membuatkan table yang namanya features.

Untuk menggunakan api nya sangat mudah sekali. Anda bisa langsung letakkan ini di AppServiceProvider.php tepat di dalam metode boot. Untuk contoh saja ya, saya ingin membuat fitur baru di Parsinta, namun yang boleh melihat hanya user yang premium saja. Maka saya bisa lakukan kurang lebih seperti ini:

public function boot(): void
{
    Feature::define('golden-features', function (User $user) {
        return $user->is_subscribed;
    });
}

Dan ketika kita ingin menampilkannya di blade, itu sangat mudah sekali dengan blade directive yang diberikan yaitu @feature.

@feature('golden-features')
    <p>Golden features are enabled for you!</p>
@else
    <p>Golden features are not enabled for you.</p>
@endfeature

Kemudian jika ketika kita sedang bekerja dengan front-end js seperti React or Vue. Kita bisa letakkan semua itu pada class resource yang kita punya.

class UserResource extends JsonResource
{
    'username' => $this->username,
    // ...
    'features' => Feature::all()
}

Kemudian di controller kita:

public function index(User $user): \Inertia\Response
{
    return inertia('Some/Component', [
        'user' => UserResource::make($user)
    ]);
}

Atau jika ingin, kita bisa juga memasukkan trait nya pada model yang kita inginkan.

use Laravel\Pennant\Concerns\HasFeatures;
use ...

class User extends Authenticatable
{
    use HasApiTokens;
    use HasFactory;
    use Notifiable;
    use HasFeatures;

    /**
     * ...
     */
}

Kemudian kita bisa replace yang tadinya pakai class Feature dengan hanya $this seperti:

class UserResource extends JsonResource
{
    'username' => $this->username,
    // ...
    'features' => $this->features(),
}

Maka harusnya hasilnya akan sama saja.

Resource Controller Updates

Pertama kali laravel v10 rilis, dia akan membuat native type saat kita buat resource controller seperti:

artisan make:controller ArticleController --model=Article

Maka harusnya dia akan menunjukkan metode-metode yang mempunyai native type seperti:

public function index(): Response 
{
    //
}

Namun karena banyak permasalahan disini, maka taylor selaku creator laravel memutuskan untuk menghapus return type itu. Bisa dilihat tweet nya disini.

Semoga artikel ini bermanfaat ya, like jika kalian suka dan jangan lupa untuk share ke teman-teman yang lain. Saya Irsyad, sampai jumpa di artikel selanjutnya.