Laravel 13: PHP Attributes, Cache Touch, dan Upgrade yang Paling Mulus Sepanjang Sejarah
Laravel PHP #laravel #laravel 13 #php #php attributes

Laravel 13: PHP Attributes, Cache Touch, dan Upgrade yang Paling Mulus Sepanjang Sejarah

A
Abd. Asis
5 min read
Bagikan:

Setiap tahun, komunitas Laravel menunggu rilis mayor berikutnya dengan campuran antusias dan sedikit cemas: fitur apa yang datang, dan berapa banyak kode yang perlu ditulis ulang. Laravel 13, yang dirilis 17 Maret 2026, menjawab pertanyaan kedua dengan cara yang tidak banyak orang prediksi — zero breaking changes.

Tapi itu bukan berarti rilis ini sepi konten. Taylor Otwell mengumumkan serangkaian fitur di Laracon EU yang secara langsung mengubah cara kita mengekspresikan konfigurasi di Eloquent models, queue jobs, dan console commands. Perubahan itu datang lewat PHP Attributes — fitur bahasa yang sudah ada sejak PHP 8.0, tapi baru sekarang Laravel merangkulnya dengan serius.

Artikel ini membahas semua perubahan penting di Laravel 13: apa yang baru, bagaimana cara pakainya, dan bagaimana proses upgrade dari Laravel 12.


PHP 8.3 Jadi Syarat Minimum

Sebelum masuk ke fitur, ada satu hal yang perlu dipastikan: Laravel 13 mewajibkan PHP 8.3 sebagai versi minimum. Jika proyek kamu masih di PHP 8.2, upgrade PHP dulu sebelum menyentuh composer.json.

Selain versi PHP, semua hal lain pada dasarnya tetap kompatibel. Laravel 13 mendukung PHP 8.3 hingga 8.5, dan tidak ada API publik yang dibuang atau diubah secara inkompatibel.


PHP Attributes: Cara Baru Menyatakan Konfigurasi

Ini adalah perubahan paling signifikan di Laravel 13. Sebelumnya, konfigurasi model, job, dan command dilakukan lewat class property:

class User extends Model
{
    protected $fillable = ['name', 'email', 'password'];
    protected $hidden = ['password', 'remember_token'];
    protected $table = 'users';
}

Kode seperti ini bekerja, tapi ada trade-off: semakin kompleks model, semakin panjang deretan property di bagian atas class sebelum kita bahkan bisa melihat satu method pun. Laravel 13 menawarkan alternatif lewat PHP Attributes.

Eloquent Models

Konfigurasi model yang biasanya berupa class property kini bisa dinyatakan sebagai attribute di atas deklarasi class:

use Illuminate\Database\Eloquent\Attributes\Table;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Attributes\Hidden;

#[Table('invoices', key: 'invoice_id', keyType: 'string', incrementing: false)]
#[Fillable('amount', 'status', 'user_id')]
#[Hidden('internal_notes')]
class Invoice extends Model
{
    public function lineItems(): HasMany
    {
        return $this->hasMany(LineItem::class);
    }
}

Hasilnya: begitu kamu membuka file model, kamu langsung melihat method-method yang penting — bukan wall of properties. Attribute yang tersedia di Eloquent antara lain #[Table], #[Fillable], #[Guarded], #[Hidden], #[Visible], #[Appends], #[Connection], #[Touches], dan #[Unguarded].

Perlu ditekankan: ini adalah perubahan opsional. Semua kode yang menggunakan class property tetap berjalan normal. Kamu tidak harus migrasi apapun.

Queue Jobs

Konfigurasi job yang biasanya tersebar di beberapa property bisa digabung menjadi satu blok attribute yang padat:

use Illuminate\Queue\Attributes\Tries;
use Illuminate\Queue\Attributes\Timeout;
use Illuminate\Queue\Attributes\MaxExceptions;
use Illuminate\Queue\Attributes\Backoff;

#[Tries(5)]
#[Timeout(60)]
#[MaxExceptions(3)]
#[Backoff(30)]
class ProcessPayment implements ShouldQueue
{
    use Queueable;

    public function handle(): void
    {
        // logika pembayaran
    }
}

Attribute ini juga berlaku di luar job: listeners, notifications, mailables, dan broadcast events mendukung subset attribute yang relevan masing-masing. Attribute #[Connection], #[Queue], #[UniqueFor], dan #[FailOnTimeout] juga tersedia tergantung konteksnya.

Console Commands

Command yang biasanya mendefinisikan $signature dan $description sebagai class property kini bisa menggunakan attribute:

use Illuminate\Console\Attributes\Command;

#[Command(
    signature: 'report:send {--force}',
    description: 'Send the weekly report email'
)]
class SendReportCommand extends Command
{
    public function handle(): int
    {
        // logika command
        return self::SUCCESS;
    }
}

Bagi yang terbiasa dengan Symfony Console, pola ini mungkin terasa familiar — dan memang begitulah asal inspirasinya.


Cache::touch() — Perpanjang TTL Tanpa Muat Data

Skenario ini cukup umum: kamu punya data yang di-cache dengan TTL tertentu, dan kamu ingin memperpanjang masa berlakunya ketika user masih aktif menggunakannya — tapi tanpa harus mengambil ulang datanya dari cache.

Sebelum Laravel 13, caranya seperti ini:

$value = Cache::get('user_session:123');
Cache::put('user_session:123', $value, 3600);

Dua operasi: ambil data, simpan ulang. Di Redis, itu berarti dua round-trip: GET lalu SET. Jika data yang di-cache cukup besar, kamu mentransfer data itu melalui jaringan tanpa benar-benar memerlukannya.

Laravel 13 menambahkan Cache::touch() untuk menghilangkan redundansi ini:

Cache::touch('user_session:123', 3600);

Di belakang layar, setiap driver dioptimalkan secara native:

  • Redis — menggunakan perintah EXPIRE tunggal
  • Memcached — menggunakan perintah TOUCH
  • Database — menjalankan satu UPDATE tanpa mengambil nilai

Method ini mengembalikan true jika key ditemukan dan TTL berhasil diperbarui, atau false jika key tidak ada. Kamu juga bisa menargetkan cache store tertentu:

Cache::store('redis')->touch('user_session:123', 3600);

Reverb Database Driver

Laravel Reverb — WebSocket server milik Laravel — sebelumnya memerlukan Redis untuk fitur scaling horizontal. Di Laravel 13, driver database ditambahkan sebagai alternatif:

// config/broadcasting.php
'reverb' => [
    'driver' => 'reverb',
    'scaling' => [
        'driver' => 'database',
    ],
],

Ini membuka pintu bagi proyek yang belum punya infrastruktur Redis tapi ingin menjalankan Reverb di lebih dari satu server. Dengan database driver, state channel disimpan di tabel database yang sudah ada — tanpa dependensi baru.


Passkeys di Starter Kits

Autentikasi passkey — standar WebAuthn yang memungkinkan login tanpa password menggunakan biometrik atau PIN perangkat — kini tersedia langsung di starter kits Laravel dan Laravel Fortify. Ini bukan sekadar integrasi library pihak ketiga; passkey dibangun sebagai opsi first-party yang bisa langsung diaktifkan saat membuat proyek baru.


Cara Upgrade dari Laravel 12

Upgrade ke Laravel 13 adalah proses paling singkat dibandingkan rilis mayor sebelumnya karena tidak ada breaking changes. Langkahnya:

Pertama, pastikan server atau environment kamu sudah menjalankan PHP 8.3 atau lebih baru:

php --version

Kemudian ubah versi di composer.json:

{
    "require": {
        "php": "^8.3",
        "laravel/framework": "^13.0"
    }
}

Jalankan update dan bersihkan cache:

composer update
php artisan config:clear
php artisan cache:clear
php artisan view:clear

Jika ingin proses upgrade yang lebih terpandu — terutama untuk proyek dengan banyak dependensi — Laravel Shift tersedia untuk mengotomasi langkah-langkah tersebut dengan pull request yang bisa direview.

Untuk proyek yang tidak terburu-buru: Laravel 12 masih menerima bug fixes hingga Agustus 2026 dan security fixes hingga Februari 2027, jadi tidak ada tekanan untuk langsung upgrade hari ini.


Kesimpulan

Laravel 13 bukan rilis yang datang dengan perombakan arsitektur — justru sebaliknya. PHP Attributes memberi developer pilihan cara mengekspresikan konfigurasi yang lebih bersih tanpa memaksa migrasi apapun. Cache::touch() menyelesaikan satu friction kecil yang sudah lama ada. Reverb database driver dan passkeys menghapus dependensi eksternal yang selama ini menjadi penghalang adopsi. Kalau kamu sudah di PHP 8.3, tidak ada alasan kuat untuk menunda upgrade.

Referensi

  1. 1Laravel 13: Launch Date and New Features (News from Laracon EU) — Laravel Daily
  2. 2Laravel 13: New Features, Release Date, Install Now — Nabil Hassen
  3. 3An early look at Laravel 13’s features and changes — Benjamin Crozat
  4. 4Upgrade Guide — Laravel Documentation

Tentang Penulis

Abd. Asis

Abd. Asis

Software Developer dan Laravel Programmer dari Madura, Indonesia. Passionate tentang PHP, Laravel, dan teknologi web modern.

Artikel Terkait

Artikel lain yang mungkin menarik untuk kamu