Laravel 13 rilis pada 17 Maret 2026. Kalau kamu sudah terbiasa dengan cadence rilis tahunan Laravel, ini bukan kejutan. Yang menarik adalah arah perubahannya, Laravel mulai menyediakan tooling AI secara first-party, memperkuat standar API, dan membuat konfigurasi lebih deklaratif lewat PHP attributes.
Dari sisi upgrade, kabar baiknya cukup bagus. Menurut release notes resmi, sebagian besar aplikasi Laravel bisa upgrade ke versi 13 tanpa banyak perubahan kode. PHP minimum naik ke 8.3 (dari 8.2 di Laravel 12), jadi pastikan server sudah siap sebelum mulai.
Pada artikel kali kita akan membahas tentang fitur-fitur baru pada laravel 13, Berikut fitur-fitur utama yang akan dibahas:
- Laravel AI SDK — SDK first-party untuk fitur AI
- JSON:API Resources — resource class yang otomatis comply dengan spesifikasi JSON:API
- Vector Search — pencarian semantik native di query builder
- Queue Routing — routing job dari satu tempat
- PHP Attributes — middleware, authorization, dan job config yang lebih deklaratif
- Cache::touch() — perpanjang TTL tanpa baca ulang value
- PreventRequestForgery — CSRF middleware yang ditingkatkan
Persyaratan Laravel 13
Sebelum upgrade atau mulai proyek baru, cek dulu requirement-nya:
| Aspek | Laravel 12 | Laravel 13 |
|---|---|---|
| Rilis | 24 Feb 2025 | 17 Mar 2026 |
| PHP Minimum | 8.2 | 8.3 |
| PHP Maximum | 8.5 | 8.5 |
| Bug Fixes | Sampai 13 Aug 2026 | Sampai Q3 2027 |
| Security Fixes | Sampai 24 Feb 2027 | Sampai 17 Mar 2028 |
Perubahan paling signifikan dari sisi requirement adalah kenaikan PHP minimum ke 8.3. Kalau server masih menggunakan PHP 8.1 atau 8.2, upgrade PHP dulu sebelum upgrade Laravel.
Laravel tetap menggunakan semantic versioning, dan release notes menyebutkan bahwa upgrade dari Laravel 12 relatif mudah dengan minimal breaking changes.
Laravel AI SDK, Bangun Fitur AI Tanpa Package Tambahan
Ini mungkin fitur yang paling banyak dibicarakan. Laravel 13 menyertakan AI SDK sebagai package first-party, artinya kamu bisa membangun fitur AI — text generation, agents, image generation, audio, dan embeddings — langsung tanpa install package third-party atau menulis API wrapper sendiri.
SDK-nya bersifat provider-agnostic. Kode yang sama bisa dipakai dengan OpenAI, Anthropic, atau provider lain cukup dengan mengganti konfigurasi. AI SDK v1.0 diumumkan pada September 2026, jadi statusnya sudah production-ready.
Text Generation dengan Agent
use App\Ai\Agents\SalesCoach;
$response = SalesCoach::make()->prompt('Analyze this sales transcript...');
return (string) $response;
Agent di sini bukan sekadar wrapper untuk API call. Laravel menyediakan abstraksi yang mendukung tool-calling, di mana agent bisa memanggil function yang sudah didefinisikan untuk menyelesaikan task secara bertahap.
Image Generation
use Laravel\Ai\Image;
$image = Image::of('A donut sitting on the kitchen counter')->generate();
$rawContent = (string) $image;
Audio (Text-to-Speech)
use Laravel\Ai\Audio;
$audio = Audio::of('I love coding with Laravel.')->generate();
$rawContent = (string) $audio;
Embeddings
use Illuminate\Support\Str;
$embeddings = Str::of('Napa Valley has great wine.')->toEmbeddings();
Embeddings ini yang menjadi dasar untuk fitur vector search yang akan dibahas di bagian selanjutnya. Hasil dari toEmbeddings() adalah array numerik yang merepresentasikan makna semantik dari teks.
Yang perlu diingat: AI SDK membutuhkan API key dari provider (OpenAI, Anthropic, dll). Konfigurasi ini perlu di-setup di file environment sebelum fitur AI bisa digunakan.
JSON API Resources
Buat developer yang pernah membangun API yang harus comply dengan spesifikasi JSON:API, prosesnya biasanya cukup melelahkan. Format response-nya ketat — resource objects, relationships, links, sparse fieldsets — dan membangun semua itu manual di toArray() itu repetitif dan rawan salah.
Laravel 13 memperkenalkan JsonApiResource, sebuah resource class baru yang otomatis menghasilkan response sesuai spesifikasi JSON:API.
Membuat JSON - API Resource
Generate resource-nya dengan Artisan:
php artisan make:resource PostResource --json-api
Kemudian definisikan attributes dan relationships:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\JsonApi\JsonApiResource;
class PostResource extends JsonApiResource
{
public $attributes = [
'title',
'body',
'created_at',
];
public $relationships = [
'author',
'comments',
];
}
Bandingkan dengan JsonResource biasa yang membutuhkan toArray() — di sini cukup deklarasikan field apa saja yang perlu diekspos. Sisanya ditangani oleh framework.
Penggunaan di Route
use App\Http\Resources\PostResource;
use App\Models\Post;
Route::get('/api/posts/{post}', function (Post $post) {
return new PostResource($post);
});
Response yang dihasilkan sudah otomatis mengikuti format JSON:API, termasuk Content-Type application/vnd.api+json:
{
"data": {
"id": "1",
"type": "posts",
"attributes": {
"title": "Hello World",
"body": "This is my first post."
}
}
}
JsonApiResource juga mendukung sparse fieldsets, relationship includes, dan lazy attribute evaluation. Kalau kamu sudah terbiasa dengan spesifikasi JSON:API, fitur ini menghemat banyak boilerplate.
Pencarian Semantik dengan Vector Search
Vector search memungkinkan pencarian berdasarkan makna, bukan hanya kata kunci. Misalnya, query "restoran enak di Jakarta" bisa menemukan dokumen yang berisi "tempat makan terbaik di ibukota" meskipun kata-katanya berbeda. Ini dimungkinkan karena teks dikonversi menjadi embedding — representasi numerik dari makna teks.
Laravel 13 menambahkan whereVectorSimilarTo() ke query builder, mendukung PostgreSQL dengan extension pgvector dan MariaDB 11.7+.
Pencarian dengan Embedding Array
$documents = DB::table('documents')
->whereVectorSimilarTo('embedding', $queryEmbedding, minSimilarity: 0.4)
->limit(10)
->get();
Parameter minSimilarity menentukan threshold kesamaan (0.0–1.0). Nilai 0.4 berarti hanya dokumen dengan similarity minimal 40% yang dikembalikan. Angka ini perlu di-tuning tergantung dataset — terlalu tinggi hasilnya terlalu sedikit, terlalu rendah hasilnya tidak relevan.
Pencarian dengan String
Yang lebih menarik, kamu bisa langsung memasukkan string dan biarkan Laravel men-generate embedding secara otomatis via AI SDK:
$documents = DB::table('documents')
->whereVectorSimilarTo('embedding', 'Best wineries in Napa Valley')
->limit(10)
->get();
Ini sangat memudahkan karena tidak perlu generate embedding secara manual sebelum melakukan query.
Untuk menggunakan fitur ini, pastikan database sudah disiapkan. Di PostgreSQL, install extension pgvector terlebih dahulu. MariaDB versi 11.7 ke atas sudah mendukung vector secara native (dukungan MariaDB ditambahkan di Laravel v13.27.0).
Use case yang cocok: pencarian dokumen internal, rekomendasi konten, FAQ semantik, atau fitur "artikel terkait" yang lebih cerdas dari sekadar tag matching.
Queue Routing - Atur Antrian Job dari Satu Tempat
Sebelum Laravel 13, mengatur connection dan queue untuk setiap job cukup tersebar. Ada yang di-set di job class lewat property, ada yang di-set saat dispatch dengan onQueue() atau onConnection(). Kalau mau ganti routing, harus edit di banyak tempat.
Queue::route() menyelesaikan masalah ini:
Queue::route(ProcessPodcast::class, connection: 'redis', queue: 'podcasts');
Letakkan di AppServiceProvider::boot(), dan semua dispatch ProcessPodcast otomatis diarahkan ke connection redis dan queue podcasts. Tidak perlu lagi menambahkan onQueue() di setiap tempat dispatch dilakukan.
Keuntungan lainnya: ketika ingin memindahkan job ke queue yang berbeda (misalnya saat scaling atau reorganisasi worker), cukup ubah di satu tempat.
PHP Attributes - Konfigurasi Lebih Deklaratif
Laravel 13 memperluas penggunaan PHP attributes di beberapa area. Pendekatan ini membuat konfigurasi berada langsung di class atau method yang relevan, bukan tersebar di file route, constructor, atau interface terpisah.
Controller Middleware dan Authorization
<?php
namespace App\Http\Controllers;
use App\Models\Comment;
use App\Models\Post;
use Illuminate\Routing\Attributes\Controllers\Authorize;
use Illuminate\Routing\Attributes\Controllers\Middleware;
#[Middleware('auth')]
class CommentController
{
#[Middleware('subscribed')]
#[Authorize('create', [Comment::class, 'post'])]
public function store(Post $post)
{
// ...
}
}
Dengan #[Middleware('auth')] di level class, semua method di controller tersebut otomatis menggunakan middleware auth. Untuk method tertentu, tambahkan attribute di level method. #[Authorize] adalah shortcut untuk can middleware — tidak perlu lagi mendefinisikan middleware authorization secara terpisah.
Ada juga #[WithoutMiddleware] untuk meng-exclude middleware tertentu dari method yang tidak memerlukannya.
Sebelumnya, untuk mendaftarkan middleware di controller harus mengimplementasi HasMiddleware interface. Pendekatan attribute ini lebih ringkas dan konfigurasinya langsung terlihat di tempat yang relevan.
Job Attributes
Untuk job, ada beberapa attribute baru:
#[Tries(3)]— jumlah percobaan#[Backoff(10)]— delay antar retry (detik)#[Timeout(120)]— batas waktu eksekusi#[FailOnTimeout]— tandai job sebagai failed jika timeout#[UniqueFor(300)]— pastikan job unik selama periode tertentu (detik)
Ini menggantikan property $tries, $backoff, dan $timeout yang sebelumnya didefinisikan di dalam job class.
Debounced Jobs
Fitur ini berguna saat job yang sama di-dispatch berkali-kali dalam waktu singkat — misalnya update search index saat bulk update produk. Dengan #[DebounceFor], hanya dispatch terakhir yang benar-benar dijalankan:
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Queue\Attributes\DebounceFor;
#[DebounceFor(30)]
class UpdateSearchIndex implements ShouldQueue
{
use Queueable;
public function __construct(public int $productId)
{
}
public function debounceId(): string
{
return (string) $this->productId;
}
}
debounceId() menentukan identitas debounce. Pada contoh di atas, debounce berlaku per productId — jadi update untuk product ID 1 dan product ID 2 tetap berjalan independen, tapi update berulang untuk product ID yang sama dalam 30 detik hanya menjalankan yang terakhir.
Cache::touch() - Perpanjang TTL Cache dengan Mudah
Sebelum Laravel 13, untuk memperpanjang TTL sebuah cache item, prosesnya biasanya: get() nilainya, lalu put() ulang dengan TTL baru. Cara ini tidak praktis karena harus mengambil value yang sebenarnya tidak perlu diubah, hanya untuk menyimpannya kembali dengan TTL baru.
Cache::touch() menyederhanakan proses ini — perpanjang TTL tanpa perlu mengambil ulang value:
// Perpanjang TTL 1 jam (3600 detik)
Cache::touch('key', 3600);
// Dengan Carbon instance
Cache::touch('key', now()->addHours(2));
Method ini mengembalikan true jika berhasil, atau false jika item cache tidak ditemukan. Menerima integer (detik) atau DateTimeInterface sebagai parameter TTL.
Kapan berguna? Session keepalive, memperpanjang rate limiter window, atau cache warming scenario di mana value-nya mahal untuk dihitung ulang tapi TTL-nya perlu di-refresh.
PreventRequestForgery - CSRF yang Lebih Kuat
Laravel 13 memperkenalkan middleware CSRF yang ditingkatkan bernama PreventRequestForgery. Perbedaan utamanya: middleware baru ini menambahkan origin-aware request verification di atas token-based CSRF protection yang sudah ada.
Buat sebagian besar aplikasi, perubahan ini transparan — tidak perlu mengubah kode apa pun. Middleware baru ini tetap backward-compatible dengan mekanisme CSRF token yang sudah ada.
Perlu diperhatikan: jika aplikasi punya custom CSRF logic (misalnya override VerifyCsrfToken), review kembali implementasinya setelah upgrade ke Laravel 13.
Fitur Tambahan Laravel 13
Selain fitur-fitur utama di atas, ada beberapa tambahan dari CHANGELOG yang layak kamu diketahui:
- Mercure broadcast driver (v13.32.0) — alternatif broadcasting selain Pusher dan Ably, menggunakan protokol Mercure.
copyToDisk()danmoveToDisk()(v13.32.0) — method baru pada Storage untuk memindahkan file antar disk tanpa download-upload manual.- Read-through filesystem (v13.26.0) — cache layer untuk filesystem yang otomatis menyimpan file yang sering diakses.
whereBinary()(v13.27.0) — query builder clause untuk pencarian pada kolom binary.chunkBy()(v13.30.0) — method collection baru untuk membagi collection berdasarkan callback.- Valkey protocol support (v13.33.0) — support untuk protocol
valkey://danvalkeys://, berguna jika menggunakan Valkey sebagai pengganti Redis. foreignUlidFor()(v13.25.0) — schema helper untuk foreign key yang menggunakan ULID.
Upgrade dari Laravel 12 ke Laravel 13
Menurut release notes resmi, sebagian besar aplikasi Laravel bisa upgrade tanpa banyak perubahan kode. Berikut langkah umum yang perlu dilakukan:
- Upgrade PHP ke 8.3 - ini wajib, Laravel 13 tidak berjalan di PHP 8.2 ke bawah.
- Update
composer.json- ubah versi framework:"laravel/framework": "^13.0" - Jalankan
composer update. - Review breaking changes - meskipun minimal, cek perubahan pada
VerifyCsrfToken→PreventRequestForgeryjika ada custom CSRF logic. - Jalankan test suite - pastikan semua test masih pass setelah upgrade.
Satu hal yang sering terlupakan: cek compatibility package third-party. Beberapa package mungkin belum release versi yang support Laravel 13 di awal rilis. Jalankan composer update dan perhatikan error yang muncul.
Untuk panduan lengkap, lihat upgrade guide resmi Laravel 13.
Kesimpulan
Laravel 13 membawa perubahan yang cukup substansial tanpa membuat upgrade menjadi rumit. AI SDK memberikan fondasi first-party untuk fitur AI, JSON:API Resources menghilangkan boilerplate API standar, dan vector search membuka kemungkinan pencarian semantik langsung dari query builder.
PHP attributes yang diperluas membuat konfigurasi controller dan job lebih deklaratif. Cache::touch() dan Queue::route() adalah quality-of-life improvement yang kecil tapi berdampak pada kode yang lebih bersih.
Fitur komentar belum diaktifkan oleh administrator.