بررسی و معرفی ویژیگی های لاراول ۸

لاراول ۸ در تاریخ ۸ سپتامبر ۲۰۲۰، به طور رسمی، منتشر شد. تیم لاراول هر ۶ ماه یک‌بار یک نسخه‌ی جدید از لاراول را با تغییرات عالی منتشر می‌کند. لاراول ۸، Non-LTS است، یعنی مثل نسخه‌ی ۶ که LTS یا Long Term Support است، پشتیبانی بلند مدت ندارد. رفع باگ‌های لاراول ۸ به مدت ۶ ماه، به صورت هفتگی، تا ۸ مارس ۲۰۲۱ ادامه دارد و رفع باگ‌های امنیتی نیز به مدت یک سال، تا ۸ سپتامبر ۲۰۲۱ پشتیبانی خواهد شد. در لاراول ۸، ویژگی‌های جدید بسیاری افزوده شده و اصلاحاتی نیز انجام شده است. در ادامه‌ی این مقاله با ما همراه باشید تا این ویژگی‌ها را با هم بررسی کنیم .

پوشه‌ی Models

تا قبل از لاراول ۵، در پوشه app، پوشه‌ی دیگری با نام Models وجود داشت که مدل‌های ایجاد شده در آنجا قرار می‌گرفتند. این پوشه از لاراول ۵ به بعد، حذف شد و مدل‌ها به طور مستقیم در پوشه‌ی app ایجاد می‌شدند. این کار در اپلیکیشن‌هایی که شامل تعداد زیادی مدل بودند، باعث ایجاد بی‌نظمی زیادی می‌شد. اما بنا به درخواست‌های متعدد توسعه‌دهندگان لاراول، مسیر app/Models دوباره به عنوان مسیر پیش‌فرض مدل‌های لاراول انتخاب شده است.

Model Factories

ویژگی Model Factory لاراول در نسخه‌ی ۸ به طور کامل بازسازی و Class Based شده و کار کردن با آن‌ها را بسیار ساده‌تر کرده است. با اجرای دستور زیر می‌توانید برای مدل Post یک کلاس Factory ایجاد کنید:

php artisan make:factory PostFactory

فایل PostFactory به شکل زیر در مسیر database/factories ایجاد می‌شود:

namespace Database\Factories;

use App\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;
class PostFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Post::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'title' => $this->faker->unique()->sentence,
            'text' => $this->faker->text,
            'status' => $this->faker->numberBetween(0, 3),
            'date' => $this->faker->date('Y-m-d', 'now'),

        ];
    }
}

به لطفا وجود trait جدید HasFactory در مدل ایجاد شده می توانید برای ایجاد تعداد مشخص از آن مانند روش زیر عمل کنید:

use App\Models\Post;

$fakePosts = Post::factory()->count(10)->create();

باید بدانید از آنجه از این پس fatory ها تنها کلاس ساده در PHP هستند می توانید در صورت لزوم کلاس های کمکی دیگری را به Eloquent model factory خود اضافه کنید.

به طور مثال شاید مدل شما یک suspended state داشته باشد که یکی از مقادیر پیش فرض آن را اصلاح می کند. حالا شما می توانید state transformations خود را با استفاده از state method پایه factory تعریف کنید. همچنین state method شما می تواند هر نامی داشته باشد.

/**
 * Indicate that the user is suspended.
 *
 * @return \Illuminate\Database\Eloquent\Factories\Factory
 */
public function suspended()
{
    return $this->state([
        'account_status' => 'suspended',
    ]);
}

پس از تعریف متد بالا می توانیم به روش زیر از آن استفاده کنیم:

use App\Models\User;

User::factory()->count(5)->suspended()->create();

Migration Squashing لاراول ۸

وقتی شما در حال ساخت اپلیکیشن خود هستید طبیعتا هرچه که جلوتر می روید تعداد migration های شما هم بیشتر می شود. این امر ممکن است باعث شود پوشه migration شما شامل تعداد خیلی زیادی از migration ها شود. اگر دوست داشته باشید می توانید با دستور زیر تمام آنها را در یک فایل SQL فشرده یا squash کنید.

php artisan schema:dump

// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune

وقتی شما دستورات بالا اجرا می کنید یک فایل schema در مسیر database/schema ایجاد می شود. حالا اگر دستور Migration را اجرا کنید ابتدا لاراول این فایل ا خوانده و سپس هر migartion دیگری که در این فایل وجود نداشته باشد را اجرا می کند.

دسته بندی job ها |Job Batching

Job Batching قابلیت جدید و قدرتمندی است که در نسخه‌ی ۸ لاراول وجود دارد. با استفاده از این ویژگی، می‌توانیم چند Job را به صورت همزمان یا در قالب یک Batch، به صف یا Queue ارسال کنیم. می‌توانیم تمام Jobهای خود را در قالب یک آرایه، به متد ()batch تعریف شده در Bus Facade پاس دهیم. این ویژگی زمانی مفید است که بتوانیم از Callback Completion‌ها استفاده کنیم تا بعد از اجرای دسته‌ای از جاب‌ها اجرا شوند. متدهای ()then() ،catch و ()finally را می‌توانیم برای تعریف Callback برای یک Batch مورد استفاده قرار دهیم. هر کدام از این Callback ها، یک نمونه از کلاس Illuminate\Bus\Batch را به عنوان پارامتر ورودی دریافت می‌کنند:

use App\Jobs\SendEmailJob;
use App\Models\User;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
use Throwable;

$batch = Bus::batch([
    new SendEmailJob(User::find(1)),
    new SendEmailJob(User::find(2)),
    new SendEmailJob(User::find(3)),
    new SendEmailJob(User::find(4)),
    new SendEmailJob(User::find(5)),
])->then(function (Batch $batch) {
    //
})->catch(function (Batch $batch, Throwable $e) {
    //
})->finally(function (Batch $batch) {
    //
})->dispatch();

متد ()then هنگامی اجرا می‌شود که همه‌ی Jobهای ارسال شده در Batch، با موفقیت اجرا شوند. متد ()catch، پس از آن ‌که اولین اخطار در اجرای Jobها شناسایی شد، اجرا می‌شود. متد ()finally نیز زمانی اجرا می‌شوند که اجرای همه‌ی Jobهای یک Batch به پایان برسد، خواه همه‌ی Jobها با موفقیت اجرا شده باشند، خواه تعدادی به خطا برخورد کرده باشند.

بهبود Rate Limiting

ویژگی محدودسازی تعداد درخواست ها در لاراول با ویژگی های جدید آپدیت شده است. درحالی که از تمام ویژگی های قبلی خود هم پشتیبانی می کند.

برای تعریف rate limiter در لاراول می توانید از RateLimiter facade و متد for استفاده کنید. متد for یک نام تابع برگشتی می پذیرد که در آن می توانید پیکربندی route هایی که باید محدود شوند را انجام دهید.

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000);
});

از آنجایی که تابع برگستی به عنوان ورودی درخواست HTTP را دارد می توانید مقادیر خود را به صورت داینامیک از request دریافت کنید:

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

بعضی اوقات ممکن است بخواهید حدود نرخ را با مقداری مقدار دلخواه تقسیم کنید. به عنوان مثال ، ممکن است بخواهید به کاربران اجازه دهید در هر دقیقه ۱۰۰ بار در هر آدرس IP به یک مسیر مشخص دسترسی پیدا کنند. برای دستیابی به این هدف ، هنگام ایجاد محدودیت نرخ ممکن است از روش by استفاده کنید

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100)->by($request->ip());
});

همچنین میتوانید از ratelimiter خود به عنوان middleware در گروهی از route ها در لاراول استفاده کنید:

Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/audio', function () {
        //
    });

    Route::post('/video', function () {
        //
    });
});

بهبود حالت تعمیر و نگهداری (Maintenance Mode)

پیش از این، برای Down کردن موقتی وب سایت به منظور تعمیر و نگهداری، از دستور php artisan down استفاده می‌کردیم. در حالت تعمیر و نگهداری، با اجرای دستورات Composer، وابستگی‌ها به‌روز می‌شوند. در نتیجه محتویات پوشه‌ی vendor به‌روز و فایل autoload جدید ایجاد می‌شود. اپلیکیشن در این حالت، به جای صفحه‌ی مربوط به حالت تعمیر و نگهداری، اخطارهای دیگری را به کاربران نمایش می‌دهد. چرا که برای نمایش صفحه‌ی فوق، نیاز است تا کل اپلیکیشن Boot شود.

اما در لاراول ۸، یک Flag جدید با نام render تعریف شده است که می‌توانید نام View موردنظرتان را به آن پاس دهید. لاراول در این حالت، ابتدا صفحه موردنظر را رندر می‌کند و سپس عملیات مربوط به تعمیر و نگهداری را انجام می‌دهد.

Flag دیگر، secret است که شما یک رشته‌ی دلخواه را به آن پاس می‌دهید. توسعه‌دهنده‌ای که از این رشته در آدرس URL استفاده می‌کند، می‌تواند در حالتی که اپلیکیشن به منظور تعمیر و نگهداری، Down است و کاربران به آن دسترسی ندارند، به صفحات مختلف اپلیکیشن دسترسی داشته باشد. در این حالت، برای توسعه‌دهنده یک کوکی ایجاد و ذخیره می‌شود.

با استفاده از Flag دیگری با نام redirect می‌توان تمام درخواست‌ها را به یک URL مشخص هدایت کرد. همچنین می‌توان با استفاده از Flag با نام status، کد وضعیت Http را ست کرد. برای مثال می‌توان از دستور زیر استفاده کرد.

php artisan down --status=200 --secret="1630542a-246b-4b66-afa1-dd72a4c43515" --render="errors.custom-error"

برای دسترسی توسعه‌دهنده به صفحات، secret باید به شکل زیر در آدرس URL استفاده شود:

https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

Closure Dispatch / Chain

اکنون با استفاده از مت catch می توانید jobهای ناموفق خود را مدیریت کنید. اگر یک job با شکست مواجه شود می توانید در Closure متد catch آن را مدیریت کنید.

use Throwable;

dispatch(function () use ($podcast) {
    $podcast->publish();
})->catch(function (Throwable $e) {
    // This job has failed...
});

Blade کامپوننت داینامیک

بعضی اوقات ممکن است لازم باشد که یک کامپوننت را رندر کنید اما نمی دانید کدام کامپوننت باید تا زمان اجرا ارائه شود. در این شرایط ، اکنون می توانید از x-dynamic-component در کامپوننت ها لاراول استفاده کنید تا کامپوننت را بر اساس مقدار زمان اجرا یا متغیر ارائه دهید:

<x-dynamic-component :component="$componentName" class="mt-4" />

بهبود Event Listener

اکنون برای تعریف اینکه یک event به چه listener هایی باید گوش کند میتوان از Event::listen متد استفاده کرد. در Closure می توان listener های یک event را مشخص کرد.

use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;

Event::listen(function (PodcastProcessed $event) {
    //
});

برای استفاده از صف ها باید به شکل زیر عمل کنید:

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;

Event::listen(queueable(function (PodcastProcessed $event) {
    //
}));

همچنین اگر قصد داشته باشید صف ها را بیشتر مدیریت کنید می توانید از catch مانند کد زیر عمل استفاده کنید:

Event::listen(queueable(function (PodcastProcessed $event) {
    //
})->catch(function (PodcastProcessed $event, Throwable $e) {
    // The queued listener failed...
}));

تغییر زمان در تست های لاراول ۸

اکنون در لاراول ۸ میتوانید در تست های خود زمان فعلی را را دستکاری کنید! در ادامه متدهای ان را مشاهده می کنید که میتوانید از آنها استفاده کنید در تست ها:

public function testTimeCanBeManipulated()
{
    // Travel into the future...
    $this->travel(5)->milliseconds();
    $this->travel(5)->seconds();
    $this->travel(5)->minutes();
    $this->travel(5)->hours();
    $this->travel(5)->days();
    $this->travel(5)->weeks();
    $this->travel(5)->years();

    // Travel into the past...
    $this->travel(-5)->hours();

    // Travel to an explicit time...
    $this->travelTo(now()->subHours(6));

    // Return back to the present time...
    $this->travelBack();
}

بهبود دستور Artisan Serve

در نسخه‌های پیشین لاراول، در صورت استفاده از سرور داخلی PHP با دستور php artisan serve، اگر تغییری در فایل env. صورت بگیرد، ناچاریم سرور را Restart کنیم. در لاراول ۸، با تغییر فایل env.، عمل Restart به صورت خودکار انجام می‌گیرد.

 استایل صفحه بندی با Tailwind

استایل جدید صفحه بندی لاراول با Tailwind CSS به صورت پیش فرض به لاراول اضافه شده است. همچنین چارچوب Bootstrp 4 و Bootstrap 3 همچنان وجود دارد.

 

خب در این مقاله آموزشی از سایت دیتادیزاین به بررسی کامل تغییرات و ویژگی های لاراول ۸ پرداختیم و امیدواریم که از این امکانات در پروژه های خود استفاده کنید .

موفق و شاد باشید 🙂

0

مدیر کل

لیسانس حسابداری هستم ولی به دلیل علاقه ام به برنامه نویسی چندین ساله تو این زمینه فعالیت میکنم .


در شبکه های اجتماعی
نظرات کاربران

دیدگاهتان را بنویسید

شما میتوانید برای وارد کردن لینک و کدهایHTML از تگ های زیر استفاده کنید : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>