سفارش تبلیغ
صبا ویژن

امکانات جدید لاراول 8

خلاصه 8 سپتامبر 2020 فرا رسید و نسخه 8 فریمورک محبوب لاراول منتشر شد. در لاراول نسخه 7 ما تغییر ورژن بندی را داشتیم که تصمیم بر آن شد لاراول از ورژن بندی معنایی (Semantic Versioning)  پیروی کند و هر 6 ماه آپدیت اصلی با تغییر نسخه ارائه شود و آپدیت ها کوچک تر به صورت نسخه های کوچک تر از ورژن اصلی منتشر شوند. حالا 6 ماه از انتشار لاراول 7 گذشته و وقت تغییر نسخه اصلی لاراول بود که Tylor خالق لاراول امروز طی یک برنامه اینترنتی خبر انتشار لاراول 8 را اعلام و به بررسی امکانات و تغییرات لاراول 8 پرداخت. قطعا این فرمیورک محبوب مانند همیشه امکانات جدید برای عاشقان خودش در این نسخه هم به همراه دارد که در ادامه قصد داریم به بررسی کامل لاراول نسخه 8 بپردازیم، پس با هیرود همراه باشید و ادامه این مقاله را از دست ندهید.

طراحی سایت بیمه

معرفی لاراول 8

Laravel 8 بهبودهای ایجاد شده در لاراول 7 را با ارائه ویژگی هایی جدید زیر ادامه می دهد:

 

- معرفی لاراول Jetstream

- کلاس های model factory

- migration squashing

-  job batching

- improved rate limiting

-بهبود صف

- blade component های داینامیک

- View های صفحه بندی با Tailwind

- time testing helpers

- بهبود دستور artisan serve

- بهبود event listener

- و رفع و بهبود برخی از باگ ها

 

مدت زمان پشتیبانی رفع باگ و نکات امنیتی در لاراول 8

همچنان نسخه پایدار یا همان LTS لاراول نسخه 6 است که مدت زمان بیشتری نسبت به سایر نسخه ها توسط لاراول پشتیبانی شده و مشکلات امنیتی و باگ های موجود و گزارش شده در آن رفع می شود. اگر نگاهی به جدول زیر بندازیم خواهیم فهمید نسخه 6 لاراول تا از نظر امنیتی تا سال 2022 پشتیبانی شده و تا سال 2021 باگ های آن رفع می شود اما نسخه 8 لاراول هم از نظر امنیتی و هم از نظر رفع باگ به ترتیب تا September و March سال 2021 پشتیبانی می شوند. پس اگر دنبال پایداری بیشتر هستید می توانید از نسخه لاراول 6 استفاده کنید اما قطعا به همین سادگی نمی توان از ویژگی ها جذاب لاراول 7 و لاراول 8 گذشت ??

 

ورژن بندی لاراول و لاراول 8

 

لاراول Jetstream چیست؟

هماره با انتشار لاراول 8 پکیج لاراول Jetstream معرفی شده است. Jetstream یک داربست کاربری با طراحی بسیار زیبا برای لاراول است. Jetstream یک نقطه شروع عالی برای پروژه بعدی شماست و بسیار می تواند در راه اندازی پروژه بعدی به شما کمک کند. برخی از ویژگی های موجو در آن می توان به لاگین، ثبت نام و تایید ایمیل و همچنین تایید دور مرحله ای ، مدیریت Session ، پشتیبامی از Api با Laravel Sanctum ، مدیریت تیم ها اشاره کرد. همچنین لاراول Jetstream با جایگزین کردن داربست های موجود برای Authentication در نسخه های قبلی لاراول آنها را بهبود میبخشد. قطعا استفاده از این پکیج برای لاراول کاران بسیار جذاب و کاربردی خواهد بود. همچنین این پکیج توسط خالق لاراول ایجاد شده است.

 

Jetstream با Tailwind CSS طراحی شده است و قابلیت استفاده از فریمورک Livewire و Inertia.js را به شما می دهد.

 

 

پوشه Models در لاراول 8

خلاصه به علت درخواست های زیاد پوشه Models به صورت پیش فرض در ساختار فایل های پروژه لاراول قرار گرفت. تمامی دستورهای artisan آپدیت شده اند تا مدل های ایجاد شده در این پوشه به مسیر app/Models قرار بگیرند ، در صورت عدم وجود این پوشه با ساخت اولین مدل ایجاد خواهد شد.

 

 

 

کلاس های Model Factory در لاراول 8

کلاس های Factory برای مدل ها در لاراول دوباره نویسی شده اند و بسیار بهبود داده شده اند تا بتوان با تعریف مدل اصلی مربوطه بهتر از رابطه ها در آنها استفاده کرد. در ادامه نمونه factory ایجاد شده برای مدل user را در لاراول 8 مشاهده می کنید.

 

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),

        ];

    }

}

 

 

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

 

use App\Models\User;

 

User::factory()->count(50)->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 لاراول 8

وقتی شما در حال ساخت اپلیکیشن خود هستید طبیعتا هرچه که جلوتر می روید تعداد 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 ها در لاراول 8

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

 

می توانید از متد batch از facade Bus برای ارسال دسته از jobها استفاده کنید. زمانی این کار مفید خواهد بود که حتما از متدهای then, catch برای تعریف برگشت پاسخ استفاده کنید. مثال زیر را فهم بیشتر مشاهده کنید:

 

use App\Jobs\ProcessPodcast;

use App\Podcast;

use Illuminate\Bus\Batch;

use Illuminate\Support\Facades\Batch;

use Throwable;

 

$batch = Bus::batch([

    new ProcessPodcast(Podcast::find(1)),

    new ProcessPodcast(Podcast::find(2)),

    new ProcessPodcast(Podcast::find(3)),

    new ProcessPodcast(Podcast::find(4)),

    new ProcessPodcast(Podcast::find(5)),

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

    // All jobs completed successfully...

})->catch(function (Batch $batch, Throwable $e) {

    // First batch job failure detected...

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

    // The batch has finished executing...

})->dispatch();

 

 

بهبود Rate Limiting در لاراول 8

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

 

برای تعریف 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);

});

بعضی اوقات ممکن است بخواهید حدود نرخ را با مقداری مقدار دلخواه تقسیم کنید. به عنوان مثال ، ممکن است بخواهید به کاربران اجازه دهید در هر دقیقه 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 () {

        //

    });

});

 

 

بهبود حالت تعمیر و نگهداری در لاراول 8

در نسخه های قبلی لاراول این ویژگی ممکن است با استفاده از لیست ipمجاز دور زده شود که با استفاده از به کارگیری یک secret در نسخه 8 لاراول این بخش امن شده است.

 

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

 

php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

سپس می توانید به شکل زیر برای دسترسی به سایت عمل کنید تا لاراول برای دسترسی شما به سایت bypass cookie را خودش ایجاد کند:

 

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

 

 

Closure Dispatch / Chain در لاراول 8

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

 

use Throwable;

 

dispatch(function () use ($podcast) {

    $podcast->publish();

})->catch(function (Throwable $e) {

    // This job has failed...

});

 

 

Blade کامپوننت داینامیک در لاراول 8

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

 

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

 

 

بهبود Event Listener در لاراول 8

اکنون برای تعریف اینکه یک 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...

}));

 

ساخت سایت

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

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

 

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 لاراول 8

در لاراول 8 دیگر به اجرا مجدد دستور artisan serve پس از تغییر فایل .env نیست و تغییرات همان لحظه اعمال می شود و نیاز به راه اندازی مجدد دستی نیست!

 

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

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

تعرفه طراحی سایت

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