Laravel 6

لاراول ۶ منتشر شد. چه چیزی تغییر کرده است؟

لاراول را می‌توان یکی از شناخته‌شده‌ترین فریمورک‌های PHP دانست. در آخرین نسخه از این فریمورک محبوب (نسخه ۶) چه قابلیت‌هایی اضافه شده است؟

به‌طور کلی در نسخه ۶، بهبودهای نسخه ۵.۸ ادامه پیدا کرده است. پشتیبانی از Laravel Vapor، بهبود پاسخ‌های اعتبارسنجی، Middleware جدید برای Jobها، Lazy Collections، پیشرفت در Sub-Queryها و تفکیک بخش Front-end در یک پکیج جداگانه laravel/ui نمونه‌هایی از این تغییرات است.

تغییر روش شماره‌گذاری نسخه

در گذشته هر شش ماه یک نسخه جدید منتشر می‌شد و زیر عنوان لاراول ۵ منتشر می‌شد. به‌طور مثال ۵.۸. حالا از نسخه ۶ به بعد، لاراول و پکیج‌های رسمی آن، از روش شماره‌گذاری نسخه Semantic Versioning استفاده می‌کند.

در semver هر نسخه شامل سه بخش: اصلی (Major)، فرعی (Minor) و حل اشکال (Patch) می‌باشد. به‌طور مثال در نسخه 6.1.4، نسخه اصلی 6،‌ نسخه فرعی 1 و باگ فیکس 4 هستش.

این بدین معناست که در آینده شماره نسخه‌های لاراول سریع‌تر بالا می‌روند و هر شش ماه نسخه Major بعدی (مثلا نسخه ۷) منتشر می‌شود.

سیاست پشتیبانی

برای نسخه‌های «پشتیبانی طولانی مدت» یا LTS که نسخه ۶ هم یکی از آن‌هاست، ۲ سال پشتیبانی حل اشکال و ۳ سال پشتیبانی امنیتی ارائه می‌شود. این نسخه‌ها بلندترین مدت پشتیبانی و نگهداری را دارند.

برای نسخه‌های عادی، ۶ ماه پشتیبانی حل اشکال و ۱ سال پشتیبانی امنیتی ارائه می‌شود.

برای همه کتابخانه‌ها و پکیج‌های دیگر (مانند Lumen)، تنها آخرین نسخه، پشتیبانی می‌شود.

صفحه خطای استثناء جدید با Ignition

Ignition یک پروژه متن‌باز برای نمایش جزئیات استثناء (Exception) در لاراول است. Ignition قابلیت‌های بهتری نسبت به صفحه خطا در نسخه‌های قبلی لاراول دارد. از جمله آن‌ها می‌توان پشتیبانی بهتر از Blade و گزارش شماره خط کد دارای خطا، راه‌حل‌های قابل اجرا برای خطاهای رایج، ویرایش کد، گزارش وضعیت نشست، کاربر، درخواست و … را نام برد.

صفحه خطای استثناء جدید با Ignition
صفحه خطای استثناء Ignition

بهبود پاسخ‌های اعتبارسنجی

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

در نسخه ۶ لاراول این کار با استفاده از پیام‌های اعتبارسنجی جدید و متد جدید Gate::inspect بسیار ساده‌تر شده است. برای مثال Policy زیر را در نظر بگیرید:

/**
 * Determine if the user can view the given flight.
 *
 * @param  \App\User  $user
 * @param  \App\Flight  $flight
 * @return mixed
 */
public function view(User $user, Flight $flight)
{
    return $this->deny('Explanation of denial.');
}

پاسخ و پیام اعتبارسنجی از این Policy به‌سادگی با استفاده از متد Gate::inspect قابل دریافت است:

$response = Gate::inspect('view', $flight);

if ($response->allowed()) {
    // User is authorized to view the flight...
}

if ($response->denied()) {
    echo $response->message();
}

افزون بر این، با استفاده از Helper متد $this->authorize و یا Gate::authorize در کنترلر یا Route، پیام‌های اعتبارسنجی به‌طور خودکار به Front-End منتقل می‌شوند.

Lazy Collections

بسیاری از برنامه‌نویسان از استفاده از متدهای فعلی Collectionهای لاراول لذت می‌برند. برای تکمیل قابلیت‌های کلاس پرکاربرد Collection، لاراول ۶ کلاس LazyCollection را معرفی کرد که از قابلیت Generatorها در PHP استفاده می‌کند و هم‌زمان که امکان کار با مجموعه داده‌های بسیار حجیم را فراهم می‌کند، مصرف حافظه بسیار کمتری دارد.

برای مثال تصور کنید که قصد دارید با استفاده از کالکشن‌های لاراول یک فایل لاگ چند گیگابایتی را پردازش کنید. به‌جای این‌که کل فایل را در حافظه سیستم بارگذاری کنید، می‌توان با استفاده Lazy Collection، تنها بخش کوچکی از فایل را در هر لحظه بارگذاری کنید:

use App\LogEntry;
use Illuminate\Support\LazyCollection;

LazyCollection::make(function () {
    $handle = fopen('log.txt', 'r');

    while (($line = fgets($handle)) !== false) {
        yield $line;
    }
})
->chunk(4)
->map(function ($lines) {
    return LogEntry::fromLines($lines);
})
->each(function (LogEntry $logEntry) {
    // Process the log entry...
});

یا فرض کنید که می‌خواهید تعداد ۱۰٬۰۰۰ مدل دیتابیس را پردازش کنید، با استفاده از کالکشن‌های عادی لاراول، ابتدا باید تمام ۱۰٬۰۰۰ مدل را یک‌جا در حافظه بارگذاری کنید:

$users = App\User::all()->filter(function ($user) {
    return $user->id > 500;
});

در حالی که در لاراول ۶ متد cursor تنظیم شده است تا یک LazyCollection برگرداند و این اجازه را به شما می‌دهد که کماکان یک‌بار اطلاعات را از دیتابیس دریافت کنید، اما در هر لحظه تنها ۱ مدل در حافظه بارگذاری می‌کند و بنابراین در مصرف حافظه ۱۰٬۰۰۰ برابر صرفه‌جویی می‌شود. در مثال زیر متد filter تنها زمانی اجرا می‌شود که تک‌تک کاربران جداگانه پردازش شده باشند، و به‌مقدار زیادی مصرف حافظه را کاهش می‌دهد:

$users = App\User::cursor()->filter(function ($user) {
    return $user->id > 500;
});

foreach ($users as $user) {
    echo $user->id;
}

بهبود Subqueryهای Eloquent

لاراول ۶ قابلیت‌های مختلفی در پشتیبانی از Sub-Queryهای دیتابیس اضافه کرده است. برای مثال تصور کنید که یک جدول حاوی مقصد پرواز به‌نام destinations و یک جدول پروازها به‌نام flights به مقصدها دارید. جدول flights دارای ستون arrived_at است که نشان‌گر این است که پرواز چه زمانی به مقصد رسیده است.

با استفاده از قابلیت جدید Sub-Query، می‌توان تمام مقصد‌ها (destinations) و نام پروازی که آخرین بار در آن مقصد فرود آمده است را تنها با یک کوئری دیتابیس به‌دست آورد:

return Destination::addSelect(['last_flight' => Flight::select('name')
    ->whereColumn('destination_id', 'destinations.id')
    ->orderBy('arrived_at', 'desc')
    ->limit(1)
])->get();

به‌علاوه، می‌توان از قابلیت Sub-Query جدید برای متد orderBy استفاده کرد تا تمام مقصدها براساس زمانی که آخرین پرواز در آن مقصد نشسته است، مرتب شوند. مجدداً این کار تنها با اجرای یک کوئری دیتابیس قابل انجام است:

return Destination::orderByDesc(
    Flight::select('arrived_at')
        ->whereColumn('destination_id', 'destinations.id')
        ->orderBy('arrived_at', 'desc')
        ->limit(1)
)->get();

پکیج جدید Laravel UI

قابلیت Front-End Scaffolding که پیش‌تر به‌صورت توکار در لاراول (برای کتابخانه Vue) موجود بود، در پکیج laravel/ui استخراج شده است. با این‌کار می‌توان از فریم‌ورک‌های برنامه‌نویسی Front-End دلخواه به‌صورت مجزا استفاده کرده و همچنین نسخه مورد نظر خود را نصب کنید.

بنابراین به‌صورت پیش‌فرض Bootstrap و Vue در لاراول ۶ وجود ندارند. همچنین دستور make:auth مجزا شده است.

برای بازگشت به حالت گذشته، دستور زیر را در ترمینال وارد کنید:

composer require laravel/ui --dev

php artisan ui vue --auth

دانلود رایگان کتاب برنامه‌نویسی

هر روز یک کتاب رایگان از انتشارات پکت دریافت کنید

انتشارات پکت کمپینی به‌نام یادگیری رایگان (Free Learning) دارد و هر روز یک کتاب یا مجموعه آموزشی ویدیویی رایگان در اختیار کاربرانش قرار می‌دهد. این کتاب‌ها عمدتا در زمینه برنامه‌نویسی، مدیریت سیستم، مهندسی نرم‌افزار و هوش مصنوعی هستند. من شخصاً تا این لحظه تعداد ۲۳۲ کتاب و مجموعه ویدیو به‌همین صورت از انتشارات پکت دریافت کرده‌ام.

مراحل دریافت روزانه کتاب

برای دریافت کتاب رایگان ابتدا باید یک حساب کاربری در وب‌سایت پکت ایجاد کنید. ثبت‌نام در این سایت رایگان است. شما می‌توانید از این لینک، حساب کاربری جدیدی در سایت انتشارات بسازید.

بعد از ثبت‌نام کافیست هر روز به صفحه یادگیری رایگان در وب‌سایت انتشارات پکت مراجعه کرده و با فشردن کلید Claim Now، کتاب یا ویدیوی پیشنهاد شده را دریافت کنید.

[VSCode] معرفی اکستنشن: Auto Rename Tag

[VSCode] معرفی اکستنشن: Auto Rename Tag

Auto Rename Tag یکی از بهترین افزونه‌های ویژوال استودیو کد برای نگارش HTML هست. با این افزونه، وقتی نام یک تگ HTML رو از جایی که تگ باز شده تغییر می‌دید، تگ بسته اون هم تغییر می‌کنه، و بالعکس.

[VSCode] معرفی اکستنشن: Auto Rename Tag

نصب

جهت نصب افزونه کلید نصب را بفشارید. و یا روی این لینک کلیک کنید.

لینک افزونه در VSCode Marketplace
لینک مخزن Git افزونه در گیت‌هاب

تنظیمات

این افزونه به‌طور پیش‌فرض در زبان‌های HTML، XML، PHP و JavaScript فعال هست و برای افزودن زبان‌های دیگه، auto-rename-tag.activationOnLanguage رو به فایل config.json اضافه کنید.
ساختار تنظیمات به این‌صورت هست:

"auto-rename-tag.activationOnLanguage": [
    "html",
    "xml",
    "php",
    "javascript"
]