ویژگی های جدید Laravel 8

ویژگی های جدید Laravel 8

لاراول یکی از محبوب ترین فریم ورک های متن باز زبان PHP است که توسط Taylor Otwell جهت توسعه و ایجاد هرچه راحت‌تر برنامه های تحت وب ایجاد شده است.

از نسخه 6 به بعد، این فریم ورک تصمیم به پیروی از قوانین سیستم نسخه گذاری semantic گرفت و اعلام شد که هر شش ماه یک بار یک نسخه اصلی جدید از این فریم‌ورک، در اختیار توسعه دهندگان قرار خواهد گرفت. هرکدام از این نسخه های اصلی می‌تواند شامل تغییراتی باشد که باعث بوجود آمدن خطا در کدهایی که با نسخه های قدیمی‌تر نوشته شده است می شود. به این نوع تغییرات اصطلاحا breaking changes گفته می‌شود.

طبق اعلام سازنده فریم ورک، نسخه 8 در تاریخ 8 سپتامبر یا 18 شهریور عرضه خواهد شد. در این مطلب نگاهی به اصلی ترین قابلیت های جدید این فریم ورک می‌اندازیم.

اولین کسی باشید که به این سؤال پاسخ می‌دهید

1-Laravel Jetstream

بزرگ‌ترین قابلیت اضافه شده به لاراول در نسخه جدید، پکیج Jetstream است که کارهای مربوط به احراز هویت را انجام می‌دهد. در ادامه با قابلیت های این پکیج آشنا می شویم.

پروفایل کاربری


در این پکیج قابلیت بروزرسانی اطلاعات کاربر شامل :

·       عوض کردن تصویر پروفایل

·       ویرایش نام، ایمیل و کلمه عبور

·       احراز هویت دو مرحله ای (توسط کد ارسالی و qr code)

·       نمایش سایر نشست های فعال کاربر و امکان خروج از آنها

·       حذف اکانت

فراهم شده است که نقطه آغاز مناسبی برای بسیاری از برنامه های تحت وب است.

مدیریت توکن های api


در صورتی که برنامه شما api هایی را در اختیار کاربرانش قرار می‌دهد با افزودن یک مقدار به فایل پیکربندی Jetstream می‌توانید ساخت api ، نمایش و مدیریت دسترسی آنها را به این پکیج بسپارید. این پکیج در پشت صحنه از پکیج sanctum برای ایجاد توکن استفاده می‌کند.

تیم ها


در این پکیج قابلیت هایی از جمله مدیریت، ساخت، اضافه کردن عضو، مدیریت دسترسی و جا به جایی بین تیم ها تنها با اضافه کردن یک مقدار به فایل پیکربندی پکیج، به برنامه شما اضافه می‌شود.

پیاده سازی تمام قابلیت هایی که برای این پکیج ذکر شد توسط کلاس های کوچک و تک وظیفه ای قابل شخصی سازی و تغییر است. بخش ظاهری این پکیج توسط فریم ورک tailwind css ساخته شده است.

2-پوشه models


پس از درخواست های زیاد توسعه دهندگان لاراول برای ایجاد مدل ها در پوشه مخصوص خود بلاخره در نسخه 8 شاهد این قابلیت هستیم. دستوراتی که در آن‌ها عملیات ایجاد مدل وجود داشت، اکنون مدل ها را در خانه جدیدشان یعنی app/Models می‌سازند.

3- model factoryها


در این نسخه از لاراول model factory ها به طور کامل بازنویسی شده اند و به حالت class based تغییر کرده اند. تا اکنون factory ها یک فایل ساده php  بودند که کدی مانند زیر را در آن‌ها می‌نوشتیم.

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\User;
use Faker\Generator as Faker;
use Illuminate\Support\Str;

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/

$factory->define(User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        'remember_token' => Str::random(10),
    ];
});

اما در نسخه جدید برای ایجاد یک factory ، کلاسی می‌سازیم که از کلاس Factory ارث بری می‌کند. مانند زیر :

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = User::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }
}

اکنون که factory ها به شکل کلاس درآمده اند نوشتن state های مختلف و سایر helper متد ها برای آن‌ها بسیار راحت تر از قبل خواهد بود.

ایجاد روابط مختلف بین مدل ها نیز نسبت به قبل راحت تر شده است. می‌توانید نحوه استفاده از آن‌ها را در مستندات نسخه جدید مطالعه کنید.

4-تجمیع migration ها


اگر یک برنامه بزرگ را با لاراول توسعه می‌دهید و تعداد زیادی فایل migration دارد قابلیت جدید لاراول به کمک شما می‌آید. این قابلیت که schema dumping نام دارد به توسعه دهندگان کمک می‌کند تا فایل های migration های برنامه خود را در یک فایل جمع آوری کنند. با زدن دستور php artisan schema:dump یک فایل SQL در مسیر database/schema برای شما ساخته می‌شود که شامل کد های SQL مورد نیاز برای ایجاد دیتابیس برنامه شما است. به طور پیش فرض این دستور فایل های migration موجود را پاک نمی‌کند اما شما می توانید با اضافه کردن عبارت –prune به دستور schema:dump این کار را انجام دهید. در صورتی که فایل migration ای در طول زمان به برنامه شما اضافه شود و مجددا دستور schema:dump را اجرا کنید migration های جدید به انتهای فایل SQL ای که قبلا ساخته شده است اضافه می‌شوند.

در نسخه جدید، پس از اجرای دستور php artisan migrate ابتدا فایل SQL را اجرا می‌کند و سپس به سراغ سایر migration های موجود می‌رود.

5-اجرای دسته‌ای Job ها


اجرای دسته ای کلاس های  jobیکی از قابلیت های قدرتمندی است که به نسخه 8 لاراول اضافه شده. این قابلیت امکان اجرای همزمان چندین job موجود در صف را برای توسعه دهندگان فراهم می‌کند. (با این فرض که worker های کافی در سرور شما در حال اجرا باشند). همچنین شما می‌توانید callback هایی را بنویسید تا بعد از اجرای دسته ای از job ها اجرا شوند. سه نوع از این callback ها وجود دارد.

·       Then() : زمانی اجرا می‌شود که تمامی job های داخل دسته با موفقیت اجرا شده اند.

·       Catch() : زمانی اجرا می‌شود که اجرای اولین job با خطا مواجه می‌شود.

·       Finally() : زمانی اجرا می‌شود که اجرای job های یک دسته به اتمام می‌رسد. (بعضی از آن‌ها ممکن است با موفقیت اجرا شده باشند و بعضی دیگر به علت خطایی، کامل اجرا نشده باشند)

همه‌ی این callback ها یک ورودی از نوع کلاس Batch را دریافت می‌کنند که متد های مفیدی مانند توقف اجرای بقیه job ها، برسی وضعیت job و... را در اختیار ما قرار می‌دهند. تکه کد زیر نمونه ای از اجرای دسته ای job ها است.

Bus::batch([

new ImportJob(),

new ImportJob(),

new ImportJob(),

new ImportJob(),

new ImportJob(),

])->then(function(Batch $batch){

همه job ها با موفقیت اجرا شدند//

})->catch(function(Batch $batch) {

اولین job با خطا مواجه شد//

})->finally(function(Batch $batch) {

اجرای همه job ها به پایان رسید//

})->dispatch();


قابلیت های پیشرفته تری مانند امکان اضافه کردن job به یک دسته موجود نیز وجود دارد. این قابلیت می‌تواند هنگام پردازش داده های حجیم، جهت تقسیم پردازش سنگین به بخش های کوچک تر استفاده شود. برای بررسی دقیق تر قابلیت های پیشرفته job ها پیشنهاد می‌شود مستندات مربوط به آن را مطالعه کنید.

6-محدود کردن دفعات دسترسی به مسیر ها (rate limiting)


در نسخه جدید شما می‌توانید با استفاده از facade جدیدی به نام RateLimiter قابلیت محدود کردن دسترسی کاربران به یک مسیر را به صورت شخصی سازی شده و با قدرت بیشتری پیاده سازی کنید. با استفاده از این facade شما یک تابع callback تعریف می‌کنید و به آن یک نام اختصاص می‌دهید. ورودی این تابع callback شی Request می‌باشد تا شما بتوانید بر اساس درخواست ورودی به برنامه، میزان محدودیت را به طور dynamic تعیین  کنید. در این تابع، شما می‌توانید بر اساس ip ، سطح دسترسی کاربر درخواست دهنده یا هر مقدار دیگر، دسترسی به مسیر مورد نظر را محدود کنید. در تکه کد زیر اگر کاربر عضو بخش ویژه باشد به تعداد نامحدود می‌تواند برای upload به ما درخواست بدهد.

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

جهت اعمال این قابلیت جدید، باید نامی که برای محدود کننده خود قرار داده اید را به middleware throttle لاراول بدهید.

Route::middleware(['throttle:uploads'])->group(function () {

Route::post('/audio', function () {

//

});


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

//

});

});

توجه داشته باشید که این قابلیت جدید، تاثیری بر استفاده از middleware throttle به شیوه نسخه های قبلی ندارد.

7-حالت "در دست تعمیر"


در حال حاظر اگر دستور php artisan down را بزنید، سایت شما به حالت maintenance یا در دست تعمیر، تغییر پیدا می کند. و اگر بخواهید دسترسی عده ای را به سایت باز کنید تا بتوانند مانند حالت عادی سایت را مشاهده کنند، باید آدرس ip آن‌ها را به برنامه بدهید. این قابلیت محدودیت های زیادی را بوجود می‌آورد از جمله اینکه آدرس ip کسانی که می‌خواهید دسترسی به سایت را برایشان باز کنید ممکن است تغییر کند و یا اینکه لازم است برای  افراد زیادی این کار را انجام دهید.

در نسخه جدید لاراول شما می توانید هنگام اجرای دستور down عبارت—secret  را اضافه کنید و یک مقدار دلخواه را برای آن در نظر بگیرید. مانند : php artisan down –secret=sokan-academy

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

8-سفر در زمان در  تست نویسی


هنگام نوشتن تست به طور معمول این نیاز پیش می‌آید که بتوانیم زمانی که توابع now() یا Carbon::now() بر می‌گردانند را تغییر دهیم. در نسخه جدید لاراول انجام این کار بسیار راحت است.

public function testTimeCanBeManipulated()

{

// سفر به آینده

$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();

سفر به گذشته//

$this->travel(-5)->hours();

 سفر به یک زمان خاص//

$this->travelTo(now()->subHours(6));

 بازگشت به زمان حال//

$this->travelBack();

}

در این مطلب سعی شد قابلیت های اصلی که به نسخه جدید فریم ورک لاراول اضافه شده است را شرح دهیم. البته که امکانات نسخه جدید تنها به قابلیت های ذکر شده محدود نمی‌شوند. قابلیت هایی مانند صفحه landing جدید، کامپوننت های dynamic در blade  ها، listener هایی که به شکل closure نوشته می‌شوند و... نیز به این نسخه اضافه شده اند که با مطالعه مستندات فریم ورک لاراول می‌توانید با آن‌ها آشنا شوید.