مقدمه

همانطور که میدانید آخرین نسخه Laravel 8.0 در September 8 منتشر شد. در این مقال قصد داریم ویژگی های جدیدی که در این فریم ورک محبوب و قدرتمند اضافه شده است را باهم برسی کنیم.

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

فقط نکته ای حائز اهمیتی که باید به آن اشاره کنم این است که Laravel در طی نسخه های انتشار داده، در نسخه 6 LTS طبق آماری که منتشر شده نسبت به سایر نسخه ها توسط لاراول پشتیبانی شده و مشکلات امنیتی و باگ های موجود و گزارش شده در آن رفع می شود و پایدارتر می باشد اگر نگاهی به جدول زیر بندازیم خواهیم فهمید نسخه 6 لاراول از نظر امنیتی تا سال 2022 پشتیبانی شده ولی با این حساب نمیشه از وپژگی های جدید لاراول گذشت.

ويژگی های جدید لاراول

بهترین ویژگی که در لاراول نسخه ۸ اضافه شد مفهومی به نام Jetstream می باشد که یک داربست کاربردی با طراحی بسیار زیبا برای لاراول است که می تواند یک نقطه شروع ایده آل برای پروژه شما باشد. حال علاوه بر این موارد زیر را به همراه داریم :

۱. Login/ Registration

۲. E-mail verification

۳. Two-factor authentication

۴. Session management

۵. API support via Laravel Sanctum

در ویژگی جدید لاراول همراه خود یک صفحه ورود جدید ارایه میدهد که دارای تم تیره و روشن می باشد که با استفاده از TailwindCSS ایجاد شده است.حالا بریم یکی یکی ویژگی ها جدید لاراول و معرفی کنیم.

Route Caching Improvements

این ویژگی ذخیره سازی مبتنی بر closure-based را پشتیبانی می کند‌، همانطور که میدانید قبل از لاراول ۸ ما می توانستیم مسیر های متنی بر کنترل ها را ذخیره کنیم و هر گونه closure-based و ایجاد بسته جدید باعث خرابی مسیر ذخیره می شود ولی حالا این مشکل در نسخه جدید لاراول حل شده است.

Route::get('/clear-cache-all', function() {
    Artisan::call('cache:clear');

    dd("Cache Clear All");
});

Dynamic Blade Components && attributes

در این بخش تمام child components ها داری ویژگی $attributes هستند، در لاراول ۷ هنگامی که یک کامپونت را گسترش می دهید دکمه فرزند خصوصیات $attributes را از خود نمی توانست رد کند.

<button {{'{{'}} $attributes }}>
   {{'{{'}} $slot }}
</button>

همانطور که مشاهده می کنید دکمه مورد نظر می تواند خصوصیات خود را به والدش معرفی کند. این ویژگی به شما کمک می کند تا اجزای قابل توسعه بسازید. گاهی اوقات شما نیاز دارید یک کامپونت را رندر کنید ولی نمی دانید که کدام جزء تا زمان رندر باید اجرا شود در همچین وضعیتی شما میتوانید از قابلیت جدید به نام x-dynamic-component برای رندر کردن کامپونت بر اساس مقدار اجرا یا متغییر استفاده کنید.

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

Migration Squashing

این ویژگی برای برنامه ها و یا مهاجرت های بزرگ پایگاه داده مفید می باشد، این ویژگی جدید که به نام Schema Dumping می باشد به شما کمک میکند که از پایگاه داده به خوبی نگهداری کنید. هنگامی که برنامه شما بزرگ می شود تعداد فایل های Migration شما هم به همان نسبت بزرگ می شود و نگهداری آن ها نسبتا سخت می کند به همین دلیل این ویژگی به شما کمک می کند با دستور زیر تمام آنها را در یک فایل SQL فشرده یا squash کنید. همچنین پایگاه داده های MySQL ، PostgreSQL و SQLite - همه از این ویژگی پشتیبانی می کنند.

php artisan schema:dump

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

Models Directory

با توجه به تقاضای زیاد جامعه پشتیبانی لاراول پوشه پیش فرض model ها به مسیر app/Models منتقل شد و اگر این دایرکتوری وجود ندارد فریم ورک فرض می کند مسیر پیش فرض مدل های شما داخل پوشه app می باشد.

Model Factory Classes

ویژگی جدید model factories بر مبنای class based به طور کامل باز نویسی شده، این ویژگی در حال حاضر قوی تر و سازگار با توسعه دهندگان می باشد در این ویژگی برای هر مدل می تواند یک factory class وجود داشته باشد. به لطفا وجود trait جدید HasFactory در مدل ایجاد شده می توانید برای ایجاد تعداد مشخص از آن مانند روش زیر عمل کنید:

use App\Models\User;

User::factory()->count(50)->create();

متد definition مجموعه ای از ویژگی ها بر می گرداند، آن را در زیر مشاهده کنید:

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),
        ];
    }
}

از آنجایی که model factory های شما از نوع کلاس PHP ساده هستند همچنین می توانید تغییر حالت ها یا state transformations به عنوان متد در کلاس خود اضافه کنید و میتوانید هر کلاس کمکی دیگر را به Eloquent model factory اضافه کنید. به عنوان مثال، ممکن است مدل کاربر شما بخواهد به حالت تعلق یا suspended state در بیاید و یکی از ویژگی ها پیش فرض آن را تغییر بدهد. شما می توانید با استفاده از روش factory's state تغییرات حالت خود را تعریف کنید شما میتوانید روش حالت خود را با هر نامی که میخواهید نامگذاری کنید.

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

حتی این ویژگی به شما این امکان را می دهد که از model factory برای روابط بین جداول خود استفاده کنید.

$users = User::factory()
            ->hasPosts(3, [
                'published' => false,
            ])
            ->create();

Improved Rate Limiting

این ویژگی محدودیت نرخ یا Rate Limiting بهبود می بخشد، با این ويژگی میتواند مدیریت محدودیت نرخ را با انعطاف پذیری پیشرفته کنترل کنید. شما می توانید با استفاده از RateLimiter facade و متد for که یک توابع بازگشتی را بر می گرداند پیکربندی route هایی که باید محدود شوند را انجام دهید.

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

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

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

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

گاهی اوقات ممکن است بخواهید محدویت نرخ را با مقادیر دلخواه کنترل کنید برای مثال شاید شما بخواهید به کاربران اجازه دهید در هر 100 دقیقه در هر ادرس IP به یک مسیر مشخص دسترسی داشته باشند برای انجام این امر می توانید از کد زیر استفاده کنید.

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 () {
        //
    });
});

Job Batching

این ویژگی به شما این مکان را می دهد که دسته از jobs را به راحتی اجرا کنید و سپس بعد اتمام هر job برخی از اقدامات را انجام دهید. می توانید از متد batch از facade Bus برای ارسال دسته از job ها استفاده کنید و در هنگام بازگشت در صورت تکمیل فراخوانی از متد های then, catch, finally استفاده کنید.

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

return $batch->id;

Routing Namespace Updates

در ویژگی های نسخه قبلی لاراول در فایل RouteServiceProvider دارای خصوصیتی به نام $namespace نامیده می شد. این پسوند فضای نامی یا namespace کنترلر های شما را تغیین می کرد.

لاراول ۸ این ویژگی را حذف کرده است و شما میتوانید کلاس های کنترل خود را بدون مشکل در فایل routes وارد کنید.
در نسخه های قبلی لاراول RouteServiceProvider دارای یک ویژگی به نام $namespace بود. مقدار این ویژگی به طور خودکار در تعاریف مسیر کنترل کننده و فراخوانی به action helper / URL::action اضافه می شود. در لاراول ۸، این ویژگی به طور پیش فرض خالی است. این بدان معناست که هیچ پیشوند فضای نام خودکار توسط لاراول انجام نمی شود. بنابراین ، در برنامه های جدید لاراول تعاریف مسیر کنترل کننده باید با استفاده از قاعده استاندارد PHP قابل فراخوانی باشد :

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

فراخوانی به روش های دیگر هم باید به شکل زیر باشد :

action([UserController::class, 'index']);

return Redirect::action([UserController::class, 'index']);

improved Maintenance Mode

در نسخه های قبلی لاراول ممکن است با استفاده از از دستور php artisan down برنامه خود را به حالت تعمیر ببرید و ممکن است آدرس های مجاز یا "allow list" از IP ها اجازه دسترسی به برنامه را داشته باشند. با استفاده از این ویژگی میتوانید با افزودن یک secret در نسخه 8 لاراول آن را امن کنید.

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

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

جمع بندی

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