لاراول 9 – نگاهی به آنچه که در راه است

لاراول 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 VintsJames 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 عرضه میشه و شامل تم های روشن و تاریک، قابلیت تنظیم «باز کردن در ویرایشگر» و موارد دیگه میشه.

laravel Ignition

 

 

هلپرهای (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

مطالب مرتبط پیشنهادی
نظر خود را ارسال کنید

آدرس ایمیل شما منتشر نخواهد شد.

*

code