لاراول 9 نسخه LTS (پایدار) بعدی لاراول هستش که تا اوایل سال 2022 منتشر میشه. توی این پست میخوام به تمام ویژگی ها و تغییرات جدیدی که تا الان اعلام شده اشاره کنم.
تغییرات تاریخ انتشار لاراول 9
لاراول 9 قرار بود حدود سپتامبر (مرداد) امسال منتشر بشه، اما تیم لاراول تصمیم گرفت که این نسخه رو، فوریه 2022 منتشر کنه:
لاراول از انواع پکیج های جامعه محور و همچنین 9 کامپوننت سیمفونی (Symfony) برای بعضی از ویژگی های خودش استفاده میکنه. سیمفونی ورژن 6 قراره که در ماه نوامبر (آبان) امسال منتشر بشه. به همین دلیل، تیم لاراول تصمیم گرفت که انتشار لاراول ورژن 9 رو تا فوریه 2022 (بهمن ماه ۱۴۰۰) عقب بندازه.
با این تاخیر، میتونن اجزای اصلی سیمفونی موجود در لاراول رو به سیمفونی ورژن 6 ارتقا بدن. در غیر اینصورت، این ارتقا تا سپتامبر 2022 طول میکشه. علاوه بر این، برای انتشار نسخه های بعدی لاراول هم بهتر میشه. چون انتشارات سالانه لاراول همیشه دو ماه بعد از انتشار سیمفونی انجام میشه.
این تغییر روی نسخه های اصلی آینده هم اثر میزاره و اون هارو عقب میندازه. برنامه آینده مثل زیر میشه:
لاراول 9: فوریه 2022 (بهمن ماه ۱۴۰۰)
لاراول 10: فوریه 2023 (بهمن ماه ۱۴۰۱)
PHP 8 حداقل نسخه در لاراول 9 است
از اونجایی که لاراول 9 به سیمفونی 6 نیاز داره و سیمفونی 6 حداقل به PHP ورژن 8 نیاز داره، پس ورژن جدید لاراول هم این شرط رو خواهد داشت. پس لاراول 9 نیاز به PHP ورژن 8 به بالا رو داره.
Stub مایگریشن های ناشناس
اوایل امسال بود که لاراول 8.37 با ویژگی جدیدی به اسم Anonymous Migrations معرفی شد. این ویژگی از برخورد یا تصادم نام کلاس های مایگریشن جلوگیری میکنه.
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();
});
}
};
وقتی لاراول 9 راه اندازی بشه، موقع اجرای دستور php artisan make:migration
این حالت بصورت پیشفرض اجرا میشه.
رابط جدید سازنده کوئری
به لطف کریس مورل، ورژن بعدی لاراول دارای یک رابط یا اینترفیس سازنده کوئری (Query Builder) جدید هستش. برای مشاهده جزئیات بیشتر درباره این اتفاق میتونید درخواست این تغییر در گیت هاب رو مشاهده کنید.
برای توسعه دهنده هایی که برای تجزیه و آنالیز استاتیک، ریفکتور کردن یا تکمیل کد به ادیتورشون اطمینان دارن ، عدم وجود رابط مشترک یا وراثت بین Query\Builder ، Eloquent\Builder و Eloquent\Relation میتونه خیلی مشکل باشه:
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
});
این ویژگی، یه اینترفیس (interface) جدید Illuminate\Contracts\Database\QueryBuilder
و یه صفت (trait) Illuminate\Database\Eloquent\Concerns\DecoratesQueryBuilder
رو اضافه میکنه. که رابط یا اینترفیس رو به جای اجرای __call
پیاده سازی میکنه.
توابع رشته ای PHP 8
از اونجایی که PHP ورژن 8 حداقل ورژن PHP خواهد بود، تام شلیک بر اساس یه درخواست به گیت هاب، توابع str_contains
، str_starts_with
و str_ends_with
رو به کلاس Illuminate\Support\Str
اضافه کرد.
تغییر SwiftMailer به Symfony Mailer
سمفونی میلر (Symfony Mailer) توسط Dries Vints, James Brooks و Julius Kiekbusch پشتیبانی و حمایت شده.
نسخه های قبلی لاراول از کتابخونه Swift Mailer برای ارسال ایمیل های خروجی استفاده میکرد. ولی این کتابخونه دیگه نگهداری نمیشه و بجای اون از کتابخونه جدید Symfony Mailer استفاده میشه.
لطفا داخل داکیومنت لاراول، بخش راهنمای ارتقا رو مطالعه کنید تا بتونید برنامه فعلی خودتون رو با Symfony Mailer هماهنگ کنید.
Flysystem 3.x
Dries Vints از Flysystem 3.x پشتیبانی و حمایت میکنه.
لاراول نسخه 9.x وابستگی استریم Flysystem رو به Flysystem 3.x ارتقا میده. Flysystem تمام فعل و انفعالات فایل سیستم ارائه شده توسط فساد Storage
رو کنترل میکنه.
بهبود Accessors / Mutators الکوئنت (Eloquent)
بهبود این بخش (Accessor / Mutators) از الکوئنت (Eloquent) توسط Taylor Otwell انجام شده.
لاراول 9.x راه حل جدیدی برای تعریف دسترسی ها (Accessors) و جهش دهنده ها (Mutators) در الکوئنت ارائه میکنه. در نسخه های قبلی لاراول، تنها راه برای تعریف Accessor و Mutators این بود که متدهای پیشوندی رو داخل مدل مورد نظر تعریف کنیم:
public function getNameAttribute($value)
{
return strtoupper($value);
}
public function setNameAttribute($value)
{
$this->attributes['name'] = $value;
}
ولی حالا داخل لاراول 9.x میتونیم با استفاده از یه روش منفرد و بدون پیشوند، یه Accessor و mutator رو با توجه به نوع برگشتی، با استفاده از 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,
);
}
علاوه بر این، این روش جدید برای تعریف Accessors، مقادیر شی رو که توسط صفت یا اتریبیونت (attribute) برگردونده میشه رو کش میکنه. درست مثل کلاس های Cast سفارشی:
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,
],
);
}
اتصالات مسیر ضمنی (Route Bindings) با Enums
Nuno Maduro به توسعه اتصالات ضمنی Enum کمک کرده.
در نسخه PHP 8.1 پشتیبانی از Enums معرفی شده. لاراول 9.x توانایی تایپ Enum رو برای تعریف مسیر (route) معرفی کرد. لاراول تنها در صورتی که مسیر درخواست داده شده با یک مقدار Enum مطابقت داشته باشه اجازه فراخوانی رو میده. در غیر این صورت، پاسخ HTTP 404 به طور خودکار برگردونده میشه. به عنوان مثال، با توجه به Enum زیر:
enum Category: string
{
case Fruits = 'fruits';
case People = 'people';
}
میتونید مسیری رو تعریف کنید که فقط در صورتی فراخونی بشه که بخش {category} مسیر fruits
یا people
باشه. در غیر این صورت، یه پاسخ HTTP 404 برگردونده میشه:
Route::get('/categories/{category}', function (Category $category) {
return $category->value;
});
گروه بندی مسیر کنترلر (Controller Route Groups)
بهبود گروه بندی مسیر کنترلر (Controller Route Groups) توسط Luke Downing انجام شده.
حالا میتونیم با استفاده از متد جدید controller
در بخش مسیر (Route)، کنترل کننده های مشترک رو بصورت مسیر های گروهی، یکجا بسازیم. بعد، موقع تعریف مسیرها، فقط باید متد داخلی اون کنترلر رو برای فراخونی اون مسیر ارائه بدیم:
use App\Http\Controllers\OrderController;
Route::controller(OrderController::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});
قالب Enum برای ویژگی الکوئنت (Enum Casting)
این قابلیت تنها در نسخه PHP 8.1 و نسخه های بالاتر در دسترس هستش.
Enum casting توسط Mohamed Said توسعه داده شده.
با این ویژگی، الکوئنت (Eloquent) به ما این امکان رو میده که مقادیر ویژگی (Attribute) خودمون رو با enums PHP تنظیم کنیم. برای انجام این کار، میتونیم ویژگی Enum مورد نظرمون رو که میخوایم از اون استفاده کنیم رو داخل آرایه ویژگی $casts
مدل خودمون قرار بدیم:
use App\Enums\ServerStatus;
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'status' => ServerStatus::class,
];
هنگامی که cast رو روی مدل خودمون تعریف میکنیم، ویژگی مشخص شده به طور خودکار به اون Enum فرستاده میشه و مقدارش از اون برگشت داده میشه (تعامل برقرار میکنه):
if ($server->status == ServerStatus::provisioned) {
$server->status = ServerStatus::ready;
$server->save();
}
اجبار به Scoped Bindings
Forced Scoped Bindings توسط Claudio Dekker توسعه داده شده.
در نسخههای قبلی لاراول، ممکن بود بخوایم مدل دوم الکوئنت رو داخل یه مسیر (route) قرار بدیم. به طوری که مدل دوم باید فرزند مدل اول باشه. برای مثال، مسیر زیر رو در نظر بگیرید، یه پست وبلاگ رو با استفاده از اسلاگ برای یک کاربر خاص برمیگردونیم:
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});
وقتی بخوایم از یه بایندینگ مخصوص و سفارشی به عنوان پارامتر مسیر تودرتو (مدل دوم) استفاده کنیم، لاراول به طور خودکار محدوده (scope) پرس و جو (query) رو برای بازیابی مدل تودرتو توسط والد (parent) خودش (مدل اول) و با استفاده از قراردادها، برای حدس زدن نام رابطه والد، بررسی میکنه. با این حال، این رفتار قبلا توسط لاراول به این صورت پشتیبانی میشد که یه کلید سفارشی برای اتصال مسیر فرزند (مدل دوم) تعریف و استفاده میشد.
اما حالا در لاراول 9.x، ما میتونیم به لاراول دستور بدیم که محدوده بایندینگ «فرزند» رو بدون تعریف کلید سفارشی هم محدود کنه. برای انجام این کار، میتونیم موقع تعریف مسیر، از متد scopeBindings
استفاده کنیم:
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
})->scopeBindings();
یا اینکه، میتونیم به یک گروه کامل از مسیرها دستور بدیم تا از scope binding استفاده کنن:
Route::scopeBindings()->group(function () {
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
});
});
API نسیم لاراول (Laravel Breeze) و Next.js
پیاده سازی Laravel Breeze API و کیت شروع کننده Next.js توسط Taylor Otwell و Miguel Piedrafita انجام شده.
کیت شروع کننده Laravel Breeze با استفاده از یک داربست، API نکست جی اس فرانت (Next.js frontend) رو دریافت و پیاده میکنه. کیت شروع کننده، ممکنه برای شروع کار یه پرش برای برنامه های لاراولی شما محسوب بشه. این داربست جدید میتونه با API احراز هویت لاراول سنکتوم (Laravel Sanctum) میکس بشه و بخش فرانت پروژه رو با جاوا اسکریپت هندل کنه.
موتور پایگاه داده لاراول اسکوت (Laravel Scout Database)
موتور پایگاه داده Laravel Scout توسط Taylor Otwell و Dries Vints پیاده سازی شده.
اگه برنامه شما از یه پایگاه دادهی کوچک و متوسط استفاده میکنه یا حجم کاری کمی داره، حالا میتونید از موتور database
به جای یه سرویس جستجوی اختصاصی مثل Algolia یا MeiliSerach استفاده کنید. موتور پایگاه داده موقع فیلتر کردن نتایج، برای تعیین و مقایسه نتایج درخواست شما، از where like
و full text indexes
استفاده میکنه.
ایندکس Full Text همراه با Where Clauses
نمایه های Full Text و Where Clauses توسط Taylor Otwell و Dries Vints توسعه داده شده.
موقع استفاده از MySQL یا PostgreSQL، روش fullText رو دیگه میشه روی ستون دلخواه اضافه کرد تا ایندکس full text به اون اضافه بشه:
$table->text('bio')->fullText();
علاوه بر این، روشهای WhereFullText
و orWhereFullText
روی متد where اضافه شده تا بتونیم برای ستون های full text نتیجه بهتری رو بگیریم. این روش ها توسط لاراول به SQL مناسب برای پایگاه داده اصلی تبدیل میشن. برای مثال، یه عبارت MATCH AGAINST برای برنامه هایی که از MySQL استفاده میکنن ایجاد میشه:
$users = DB::table('users')
->whereFullText('bio', 'web developer')
->get();
رندر کردن خطی قالب بلید (Blade)
گاهی اوقات ممکنه بخواییم یه رشته قالب خام Blade رو به HTML معتبر تبدیل کنیم. حالا میتونیم این کار رو با استفاده از متد render
موجود در فساد Blade
انجام بدیم. متد render
رشته قالب بلید و آرایه دلخواه مارو برای ارائه به الگو قبول میکنه:
use Illuminate\Support\Facades\Blade;
return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);
سرور Soketi Echo
سرور Soketi Echo توسط Alex Renoki توسعه داده شده.
این ویژگی منحصر لاراول 9.x نیست. لاراول اخیرا به مستند سازی Soketi که یه وب سوکت سازگار با Laravel Echo هستش که برای Node.js نوشته شده ، کمک کرده. Soketi یه جایگزین عالی و منبع باز برای Pusher و Ably هستش که برای اون دسته از برنامه هایی که ترجیح میدن سرور وب سوکت خودشون رو مدیریت کنن، مناسب هستش.
صفحه بندی ویوو ها با Bootstrap 5
لاراول ویوو های صفحه بندی (pagination views) خودش رو با استفاده از Bootstrap 5 پیاده سازی کرده. برای استفاده از این ویووها به جای ویووهای پیشفرض Tailwind، میتونید متد useBootstrapFive
رو داخل متد boot
کلاس App\Providers\AppServiceProvider
فراخونی کنین:
use Illuminate\Pagination\Paginator;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrapFive();
}
بهبود صفحه ارورهای Exception با Ignition
Ignition، صفحه اشکال زدایی بسیار عالی و منبع بازی هستش که توسط Spatie ایجاد شده که از ابتدا دوباره طراحی شده. Ignition جدید و بهبود یافته با لاراول 9.x عرضه میشه و شامل تم های روشن و تاریک، قابلیت تنظیم «باز کردن در ویرایشگر» و موارد دیگه میشه.
هلپرهای (Helpers) جدید
لاراول 9.x دو عملکرد کمکی جدید و راحت رو معرفی میکنه که میتونید از اون ها در برنامه شخصی خودتون استفاده کنید.
str
تابع str
یک نمونه جدید Illuminate\Support\Stringable
رو برای رشته داده شده برمیگردونه. این تابع معادل متد Str::of
هستش:
$string = str('Taylor')->append(' Otwell');
اگه هیچ آرگومانی برای تابع str
وارد نشه، تابع نمونه ای از Illuminate\Support\Str
رو برمیگردونه:
$snake = str()->snake('LaravelFramework');
to_route
تابع to_route
یه پاسخ HTTP ریدایرکت رو برای یه مسیر نامگذاری شده ایجاد میکنه و راهی واضح برای ریدایرکت به مسیرهای نامگذاری شده از مسیرها و کنترلکنندهها ارائه میکنه:
return to_route('users.show', ['user' => 1]);
در صورت لزوم، میتونید کد وضعیت HTTP رو که باید به ریدایرکت اختصاص داده بشه و هر هدر اضافی رو به عنوان آرگومان سوم و چهارم به روش to_route
ارسال کنید:
return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);
فایل server.php رو میشه حذف کرد
این یه ویژگی جزئی هستش که دیگه میتونید فایل server.php
رو از پروژه خودتون حذف کنید چون دیگه داخل فریمورک قرار میگیره. این فایل فقط برای php artisan serve
استفاده میشه.
خب خبر خوب اینه که نسخه پایدار لاراول ۹ منتشر شده و شما میتونید از وب سایت لاراول به داکیومنت این ورژن دسترسی داشته باشید.
منبع: laravel-news.com