Fitur Apa Yang Ditambahkan Ke Laravel 9
Laravel v9 adalah Laravel versi LTS berikutnya dan akan dirilis pada Februari 2022. Posting ini menguraikan semua fitur dan perubahan baru yang diumumkan sejauh ini.
Perubahan tanggal rilis Laravel 9
Laravel v9 dijadwalkan akan dirilis sekitar bulan September tahun ini, tetapi tim Laravel telah memutuskan untuk mengembalikan rilis ini ke Februari 2022:
*Laravel menggunakan berbagai paket berbasis komunitas dan sembilan komponen Symfony untuk banyak fitur dalam kerangka kerja. Symfony 6.0 akan dirilis pada bulan November. Oleh karena itu, kami telah memilih untuk menunda rilis Laravel 9.0 hingga 2022. Dengan menunda rilis, Anda dapat memutakhirkan komponen Symfony yang mendasarinya ke Symfony 6.0 tanpa harus menunggu pemutakhiran ini hingga September 2022. Selain itu, rilis tahunan selalu dua bulan setelah rilis Symfony, yang menempatkan Anda pada posisi yang lebih baik untuk rilis mendatang.Ini juga akan mendorong kembali rilis utama di masa mendatang. Jadwal selanjutnya adalah sebagai berikut.
Versi minimum PHP 8 Laravel 9
Laravel 9 membutuhkan Symfony 6.0 dan memiliki persyaratan minimum PHP 8, jadi batasan yang sama berlaku untuk Laravel 9.
Desin baru untuk routes:list
Perintah routes:list sudah lama ada di Laravel, dan salah satu masalah yang terkadang muncul adalah jika Anda telah menentukan rute yang besar dan kompleks, mencoba melihatnya di konsol bisa jadi membosankan. Ini menjadi makeover, berkat pull request dari Nuno Maduro.
Opsi cakupan pengujian baru
Opsi `artisan test --coverage` yang baru menampilkan cakupan pengujian langsung di perangkat. Ini juga mencakup opsi `--min` yang dapat digunakan untuk menunjukkan penerapan ambang batas cakupan pengujian minimum.
Anonim Stub Migrations
Awal tahun ini, Laravel 8.37 mengumumkan fitur baru bernama Anonymous Migrations yang mencegah tabrakan nama kelas migrasi.
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('people', function (Blueprint $table) {
$table->string('first_name')->nullable();
});
}
};
Ketika Laravel 9 dimulai, ini akan menjadi default saat menjalankan `php artisan make: migration`
Antarmuka Query builder baru
Berkat Chris Morrell, Laravel 9 memiliki antarmuka QueryBuilder baru dan Anda dapat melihat merged PR ini untuk semua detailnya.
*Untuk pengembang yang mengandalkan petunjuk jenis untuk analisis statis, pemfaktoran ulang, atau penyelesaian kode di IDE, kurangnya antarmuka atau pewarisan bersama antara Query\Builder, Eloquent\Builder, dan Eloquent\Relation cukup terlihat.
return Model::query()
->whereNotExists(function($query) {
// $query is a Query\Builder
})
->whereHas('relation', function($query) {
// $query is an Eloquent\Builder
})
->with('relation', function($query) {
// $query is an Eloquent\Relation
});
Fitur ini menambahkan antarmuka Illuminate\Contracts\Database\QueryBuilder baru dan sifat Illuminate\Database\Eloquent\Concerns\DecoratesQueryBuilder yang mengimplementasikan antarmuka menggantikan implementasi `__call` yang ada.
Fungsi String PHP 8
Karena PHP 8 diminimalkan, Tom Schlick telah mengirimkan PR untuk pindah menggunakan fungsi `str_contains()`, `str_starts_with()`, dan `str_ends_with()` di dalam kelas `\Illuminate\Support\Str`.
Dari Swift Mailer ke Symfony Mailer
Dukungan untuk Symfony Mailer disediakan oleh Dries Vints, James Brooks, dan Julius Kiekbusch.
Rilis Laravel sebelumnya menggunakan pustaka SwiftMailer untuk mengirim email keluar. Namun, perpustakaan tidak lagi dipertahankan dan telah diambil alih oleh Symfony Mailer.
Periksa panduan peningkatan untuk informasi lebih lanjut tentang cara memverifikasi bahwa aplikasi Anda kompatibel dengan Symfony Mailer.
Flysystem 3.x
Dukungan Flysystem 3.x disumbangkan oleh Dries Vints.
Laravel 9.x meningkatkan ketergantungan Flysystem upstream kami ke Flysystem 3.x. Flysystem mendukung semua interaksi sistem file yang ditawarkan oleh fasad Storage.
Aksesor/mutator Fasih yang ditingkatkan
Aksesor/mutator Eloquent yang ditingkatkan disediakan oleh Taylor Otwell.
Laravel 9.x menyediakan cara baru untuk mendefinisikan accessor dan mutator Eloquent. Dalam rilis Laravel sebelumnya, satu-satunya cara untuk mendefinisikan pengakses dan mutator adalah dengan mendefinisikan metode awalan dalam model Anda sebagai berikut:
public function getNameAttribute($value)
{
return strtoupper($value);
}
public function setNameAttribute($value)
{
$this->attributes['name'] = $value;
}
Namun, di Laravel 9.x, Anda dapat mendefinisikan pengakses dan mutator menggunakan metode tunggal tanpa awalan dengan mengetikkan tipe kembalian `Illuminate\Database\Eloquent\Casts\Attribute`.
use Illuminate\Database\Eloquent\Casts\Attribute;
public function name(): Attribute
{
return new Attribute(
get: fn ($value) => strtoupper($value),
set: fn ($value) => $value,
);
}
Selain itu, pendekatan baru untuk mendefinisikan pengakses ini menyimpan nilai objek yang dikembalikan oleh atribut, mirip dengan custom cast classes:
use App\Support\Address;
use Illuminate\Database\Eloquent\Casts\Attribute;
public function address(): Attribute
{
return new Attribute(
get: fn ($value, $attributes) => new Address(
$attributes['address_line_one'],
$attributes['address_line_two'],
),
set: fn (Address $value) => [
'address_line_one' => $value->lineOne,
'address_line_two' => $value->lineTwo,
],
);
}
Pengikatan rute implisit menggunakan enums
Ikatan enum implisit disediakan oleh NunoMaduro.
PHP 8.1 memperkenalkan dukungan enumerasi. Laravel 9.x memperkenalkan kemampuan untuk mengetikkan Enums petunjuk dalam definisi rute, dan Laravel hanya akan memanggil rute jika segmen akarnya adalah nilai enum yang valid di URI. Jika tidak, respons HTTP 404 akan dikembalikan secara otomatis. Misalnya, jika Anda memiliki enumerasi berikut:
enum Category: string
{
case Fruits = 'fruits';
case People = 'people';
}
`{category}` Anda dapat menentukan rute yang hanya akan dipanggil jika segmen akar adalah buah atau orang. Jika tidak, respons HTTP 404 akan dikembalikan.
Route::get('/categories/{category}', function (Category $category) {
return $category->value;
});
Controller Route Groups
perbaikan grup root disediakan oleh LukeDowning.
Anda sekarang dapat menggunakan metode controller untuk menentukan controller yang umum untuk semua route dalam grup. Kemudian, saat Anda menentukan route, Anda hanya perlu menentukan metode controller yang dipanggil oleh route.
use App\Http\Controllers\OrderController;
Route::controller(OrderController::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});
Casting atribut Eloquent dari enum
note:Pemeran enum hanya tersedia di PHP 8.1 dan di atasnya.
Enum casting disediakan oleh Mohamed Said.
Eloquent sekarang dapat memberikan nilai atribut ke enum PHP. Untuk mencapai ini, tentukan atribut dan enum untuk dilemparkan ke larik properti $casts model.
use App\Enums\ServerStatus;
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'status' => ServerStatus::class,
];
Saat Anda menentukan pemeran dalam model Anda, memanipulasi atribut secara otomatis mentransmisikan atribut yang ditentukan ke dan dari enum.
if ($server->status == ServerStatus::provisioned) {
$server->status = ServerStatus::ready;
$server->save();
}
Forced Scoped Bindings
Forced Scoped Bindings disediakan oleh Claudio Dekker.
Dalam rilis Laravel sebelumnya, Anda mungkin perlu memasukkan model Eloquent kedua dalam definisi rute dan menjadi anak dari model Eloquent sebelumnya. Sebagai contoh, pertimbangkan definisi rute berikut, yang memasukkan posting blog pengguna tertentu.
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});
Saat menggunakan pengikatan implisit dengan kunci khusus sebagai parameter root bersarang, Laravel secara otomatis membuat cakupan kueri dan disarangkan oleh induk menggunakan aturan untuk menebak nama relasi induk. Dapatkan modelnya. Namun, perilaku ini sebelumnya didukung oleh Laravel hanya jika kunci khusus digunakan untuk pengikatan root anak.
Namun, di Laravel 9.x Anda sekarang dapat memberi tahu Laravel untuk mencakup pengikatan "anak" bahkan jika Anda tidak memberikan kunci khusus. Untuk melakukan ini, Anda dapat memanggil metode scopeBindings saat menentukan rute.
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
})->scopeBindings();
Atau, Anda dapat menginstruksikan seluruh grup definisi rute untuk menggunakan binding tercakup.
Route::scopeBindings()->group(function () {
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
});
});
Laravel Breeze API & Next.js
Scaffolding Laravel Breeze API dan starter kit Next.js disediakan oleh Taylor Otwell dan Miguel Piedrafita.
Laravel Breeze Starter Kit telah menerima mode scaffolding "API" dan implementasi front-end Next.js gratis. Scaffolding starter kit ini dapat digunakan untuk memulai aplikasi Laravel yang bertindak sebagai API bersertifikat Laravel Sanctum, yang merupakan back end untuk front end JavaScript.
Laravel Scout Database Engine
Mesin database Laravel Scout disediakan oleh Taylor Otwell dan Dries Vints.
Jika aplikasi Anda berinteraksi dengan database berukuran kecil atau menengah, atau jika beban kerja Anda ringan, Anda sekarang dapat menggunakan mesin "database" Scout alih-alih layanan pencarian khusus seperti Algolia atau Meili Serach. Mesin database menggunakan klausa "di mana suka" dan indeks teks lengkap saat memfilter hasil dari database yang ada untuk menentukan hasil pencarian yang berlaku untuk kueri.
Indeks Teks Lengkap/Di Mana Klausa
Indeks teks lengkap dan klausa "di mana" disediakan oleh Taylor Otwell dan Dries Vints.
Saat menggunakan MySQL atau PostgreSQL, Anda sekarang dapat menambahkan metode fullText ke definisi kolom untuk menghasilkan indeks `fulltext`.
$table->text('bio')->fullText();
Selain itu, Anda bisa menggunakan metode whereFullText dan orWhereFullText untuk menambahkan klausa "where" teks lengkap ke kueri untuk kolom yang memiliki indeks teks lengkap. Metode-metode ini diterjemahkan oleh Laravel ke dalam SQL yang cocok untuk sistem basis data yang mendasarinya. Misalnya, klausa MATCH AGAINST dibuat untuk aplikasi yang menggunakan MySQL.
$users = DB::table('users')
->whereFullText('bio', 'web developer')
->get();
Merender Template Blade Sebaris
Anda mungkin perlu mengonversi string template Blade mentah menjadi HTML yang valid. Ini dapat dilakukan dengan menggunakan metode render yang disediakan oleh fasad Blade. Metode render menerima string template Blade dan array data opsional dan menyediakannya ke template.
use Illuminate\Support\Facades\Blade;
return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);
Soketi Echo Server
Server Soketi Echo dikembangkan oleh Alex Renoki.
Meskipun tidak terbatas pada Laravel 9.x, Laravel baru-baru ini membantu mendokumentasikan Soketi, server WebSocket kompatibel Laravel Echo yang dibuat untuk Node.js. Soketi menyediakan alternatif open source yang bagus untuk Pusher dan Able untuk aplikasi yang lebih suka mengelola server Web Socket mereka sendiri.
Bootstrap 5 tampilan pagination
Laravel sekarang menyertakan tampilan pagination yang dibangun menggunakan Bootstrap 5. Untuk menggunakan tampilan ini alih-alih tampilan Tailwind default, Anda dapat memanggil metode `useBootstrapFive` pagenator dalam metode `boot` kelas `App\Providers\AppServiceProvider`.
use Illuminate\Pagination\Paginator;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrapFive();
}
Halaman pengecualian pengapian yang ditingkatkan
Ignition, halaman debug pengecualian open source yang dibuat oleh Spatie, telah didesain ulang dari awal. Ignition baru dan lebih baik dikirimkan dengan Laravel 9.x dan menyertakan tema terang/gelap, fitur "Buka di Editor" yang dapat disesuaikan, dan banyak lagi.
Helpers Baru
Laravel 9.x memperkenalkan dua fungsi pembantu baru yang berguna yang dapat Anda gunakan dalam aplikasi Anda sendiri.
`str`Fungsi `str` mengembalikan instance `Illuminate\Support\Stringable` baru untuk string yang ditentukan. Fungsi ini setara dengan `Str::of` metode.
$string = str('Taylor')->append(' Otwell');
// 'Taylor Otwell'
Jika tidak ada argumen yang diberikan ke fungsi `str`, fungsi akan mengembalikan instance `Illuminate\Support\Str`.
$snake = str()->snake('LaravelFramework');
// 'laravel_framework'
to_route
Fungsi to_route menghasilkan respons HTTP pengalihan untuk rute bernama tertentu dan menyediakan cara ekspresif untuk mengalihkan dari rute dan pengontrol ke rute bernama.
return to_route('users.show', ['user' => 1]);
Jika diinginkan, Anda dapat meneruskan kode status HTTP dan header respons tambahan yang perlu ditetapkan ke pengalihan sebagai argumen ketiga dan keempat ke metode to_route.
return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);
Anda dapat menghapus file server.php
Ini adalah fitur kecil, tetapi sekarang Anda dapat menghapus file server.php dari proyek Anda dan itu akan disertakan dalam kerangka kerja. File ini hanya digunakan untuk melayani pengrajin php.
lagi...
Laravel 9 masih beberapa bulan lagi, dengan lebih banyak fitur dan pengumuman baru yang akan dirilis. Kami akan memperbarui posting ini segera setelah diumumkan. Lihat juga halaman rilis resmi.