Ulasan Fitur Baru di Laravel 8

3 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Fitur Baru di Laravel 8
Laravel 8

TeknoCerdas.com – Salam cerdas untuk kita semua. Framework PHP terpopuler saat ini Laravel merilis versi terbaru yaitu Laravel 8. Tepatnya pada tanggal 8 September 2020 yang lalu. Perlu dicatat bahwa Laravel 8 bukanlah versi Long Term Support (LTS). Laravel 8 akan mendapatkan perbaikan bug sampai 8 Maret 2021. Untuk dukungan perbaikan security sampai 8 September 2021.

Dilansir dari laman resminya fitur baru di Laravel 8 diantaranya.

Laravel Jetstream

Laravel Jetstream adalah sebuah utilitas kerangka pembuatan (scaffolding) untuk Laravel. Dengan Jetstream pengembang dapat menghemat waktu karena berbagai fitur-fitur utama yang ada pada sebuah web app secara otomatis tersedia dan siap digunakan.

Fitur-fitur tersebut diantaranya login, registrasi, verifikasi email, 2FA (two factor authentication), manajemen session, API via Laravel Sanctum dan manajemen team.

Laravel Jetstream menggantikan Laravel UI yang sebelumnya digunakan untuk melakukan scaffolding pembuatan web app.

Direktori app/Models

Karena permintaan yang cukup banyak dari komunitas maka sekarang default dari model berada didalam direktori app/Models. Anda dapt melihatnya langsung lewat GitHub di branch master untuk perubahan ini.

Jika direktori app/Models tidak ada maka diasumsikan model harus ditempakan di app/ direktori.

Model Factory

Saat melakukan unit testing di Laravel class Factory sangat membantu untuk melakukan generate dummy data. Model Factory pada Laravel 8 ditulis ulang dan mendapat beberapa peningkatan. Diantaranya dukungan penuh relationship dengan model class.

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    protected $model = User::class;

    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }
}

Karena developer pada class Model dapat menggunakan trait HasFactory maka pada model factory dapat digunakan cara berikut.

<?php
use App\Models\User;

User::factory()->count(50)->create();

Migration Squashing

Ketika jumlah file migrasi sudah sangat banyak hal tersebut sedikit banyak mempengaruhi kecepatan migrasi. Selain itu tidak jarang jika perubahan sudah mencapai puluhan atau ratusan file sudah hampir tidak ada yang ingin membaca dari pertama hingga migration terakhir. Jika menggunakan MySQL atau PostreSQL maka sekarang developer dapat melakukan “squash” atau menyatukan file-file migration tersebut menjadi hanya sebuah file SQL.

Perintah yang digunakan untuk melakukan migration squash.

$ php artisan schema:dump

Jika ingin melakukan dump sekaligus menghapus file migration tambahkan opsi --prune.

$ php artisan schema:dump --prune

Hasil dump atau squash akan diletakkan pada direktori database/schema. File SQL yang ada pada direktori tersebut akan dieksekusi terlebih dahulu sebelum file-file migration.

Job Batching

Job Batching memudahkan developer dalam mengeksekusi beberapa Jobs sekaligus kemudian melakukan langkah lanjutan dengan memanggil callback ketika semua Jobs selesai dieksekusi. Developer dapat menggunakan method Bus::batch() untuk mengelompokkan Jobs.

use App\Jobs\ProcessPodcast;
use App\Podcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Batch;
use Throwable;

$batch = Bus::batch([
    new ProcessPodcast(Podcast::find(1)),
    new ProcessPodcast(Podcast::find(2)),
    new ProcessPodcast(Podcast::find(3)),
    new ProcessPodcast(Podcast::find(4)),
    new ProcessPodcast(Podcast::find(5)),
])->then(function (Batch $batch) {
    // All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
    // First batch job failure detected...
})->finally(function (Batch $batch) {
    // The batch has finished executing...
})->dispatch();

return $batch->id;

Peningkatan pada Rate Limiting

Rate Limiting dapat didefiniskan dengan facade RateLimiter menggunakan for method. Method for menerima argumen berupa nama dan Closure yang harus mengembalikan konfigurasi Rate Limiting menggunakan facade Limit.

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000);
});

Closure dari for menerima instance dari object Request sehingga konfigurasi dapat dibuat on-the-fly berdasarkan kriteria tertentu.

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

Untuk melakukan limit per alamat IP dapat digunakan method by.

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100)->by($request->ip());
});

Peningkatan pada Maintenance Mode

Pada versi Laravel sebelumnya perintah artisan down dapat di-bypass menggunakan “allow list” dari alamat IP yang diperbolehkan untuk mengakses aplikasi selama maintenance mode.

Fitur ini dihapus dan digantikan dengan penggunaan token.

$ php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

Token tersebut dapat digunakan untuk melakukan bypass maintenance mode dengan mengunjungi base URL dari aplikasi.

https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

Laravel akan membuat cookie dan meredirect ke halaman root /. Cookie tersebut yang menjadi penanda bahwa website dapat digunakan seperti biasa.

Fitur baru yang ditambahkan adalah perlakuan khusus untuk segera menampilkan halaman ketika maintenance mode. Ini berguna jika saat maintance kemudian developer melakukan update lewat composer sehingga terkadang membuat pengguna masih melihat halaman yang sebenarnya.

Perintah yang digunakan untuk melakukan pre-render halaman maintance.

$ php artisan down --render="errors::503"

Peningkatan pada Queue

Terdapat method baru catch yang digunakan untuk menangkap kesalahan ketika Closure yang dijalankan pada queue gagal.

use Throwable;

dispatch(function () use ($podcast) {
    $podcast->publish();
})->catch(function (Throwable $e) {
    // This job has failed...
});

Komponen Dinamis pada Blade

Terkadang ketika melakukan render sebuah komponen pada blade tidak diketahui komponen yang mana hingga sampai pada runtime. Pada situasi seperti ini developer dapat menggunakan fitur baru dari Blade yaitu dynamic-component.

<x-dynamic-component :component="$componentName" class="mt-4" />

Tailwind Pagination View

Laravel Paginator sekarang secara default akan menggunakan Tailwind CSS framework. Untuk view yang menggunakan Bootstrap 3 dan Bootstrap 4 akan tetap tersedia.

Time Testing Helper

Ini fitur yang cukup unik karena memudahkan developer ketika berhubungan dengan pengaturan waktu saat melakukan unit testing. Class bawaan Laravel untuk tes sekarang mendukung modifikasi waktu menggunakan method travel.

public function testTimeCanBeManipulated()
{
    // Travel into the future...
    $this->travel(5)->milliseconds();
    $this->travel(5)->seconds();
    $this->travel(5)->minutes();
    $this->travel(5)->hours();
    $this->travel(5)->days();
    $this->travel(5)->weeks();
    $this->travel(5)->years();

    // Travel into the past...
    $this->travel(-5)->hours();

    // Travel to an explicit time...
    $this->travelTo(now()->subHours(6));

    // Return back to the present time...
    $this->travelBack();
}

Peningkatan pada Artisan serve

Pada versi Laravel sebelumnya jika sebuah konfigurasi environment yang disimpan .env diubah maka developer juga harus melakukan restart artisan serve.

Kini pada Laravel 8 hal itu tidak diperlukan karena secara otomatis Laravel akan mendeteksi perubahan tanpa perlu intervensi manual untuk merestart local web server yang dijalankan dari artisan serve.