لاراول 11: تغییرات و ویژگی های جدید

لاراول 11 یکی از هیجان‌انگیزترین نسخه‌های این فریم‌ورک تا کنون است. تغییرات و ویژگی‌های جدید زیادی در این نسخه وجود دارد که در این مقاله آن‌ها را بررسی می کنیم.

1. Slim Skeleton

مهمترین تغییر در لاراول 11 اسکلتون مینیمالیستی‌تر برنامه است.

هنگامی که یک پروژه جدید لاراول را نصب می‌کنید، ساختار پوشه به این صورت خواهد بود:

app/
├── Http/
│   └── Controllers/
│       └── Controller.php
├── Models/
│   └── User.php
└── Providers/
    └── AppServiceProvider.php
bootstrap/
├── app.php
└── providers.php
config
...

توجه: این تغییرات ساختاری اختیاری هستند. آنها فقط به طور پیش فرض برای پروژه‌های جدید اعمال خواهند شد. برنامه‌های کاربردی قدیمی لاراول می‌توانند ساختار قدیمی را داشته باشند.

پوشه‌های حذف شده: app/Console، app/Exceptions، app/Http/Middleware

Route ها، Middleware ها و Exception ها اکنون در فایل bootstrap/app.php رجیستر می‌شوند.

bootstrap/app.php:

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
 
return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) { 
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

همچنین پوشه routes پاکسازی شده است. فایل‌های routes/channel.php، routes/console.php و routes/api.php حذف شده‌اند.

برای مشاهده جزئیات بیشتر در مورد تغییرات انجام شده، می‌توانید درخواست pull اولیه [11.x] Slim skeleton را بررسی کنید.

2. حذف برخی فایل‌های Config

این تغییر پیشینه ای دارد. ابتدا، زمانی که تیلور ساختار مینیمالیسم (slimmer skeleton) را معرفی کرد، تمام فایل‌های کانفیگ در پوشه config/ حذف شدند. با این حال، تیلور از این تغییر راضی نبود و نسخه کانفیگ مینیمالیسم را معرفی کرد.

بنابراین، اگر به پوشه config/ لاراول 10 نگاه کنید، متوجه می شوید که این فایل ها در لاراول 11 وجود ندارند:

  • config/broadcasting.php
  • config/cors.php
  • config/hashing.php
  • config/sanctum.php
  • config/view.php

اما می توانید آنها را به صورت دستی با این دستور منتشر کنید:

php artisan config:publish

یا:

php artisan config:publish --all

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

حالا، در مورد پیکربندی Sanctum و Broadcasting صحبت خواهیم کرد…

3. API و Broadcasting: نصب اختیاری

لاراول 11 فاقد فایل routes/api.php است و Sanctum به صورت پیش فرض نصب نیست. شما می توانید زیرساخت API را با دستور آرتیسان php artisan install:api نصب کنید.

زمانی که این دستور artisan را اجرا می کنید، فایل routes/api.php ساخته شده و در bootstrap/app.php رجیستر می شود و Laravel Sanctum نصب می گردد. تنها کافیست trait Laravel\Sanctum\HasApiTokens را به مدل User اضافه کنید.

مشابه تغییرات API، برادکستینگ نیز قابل نصب است: برای آماده سازی برنامه، می توانید از دستور php artisan install:broadcast استفاده کنید.

4. پیش فرض های جدید: Pest و SQLite

در لاراول 11، چند تنظیم پیش فرض جدید وجود دارد.

فریمورک تست: Pest

تیلور یک نظرسنجی در شبکه اجتماعی توییتر انجام داد و اکثر مردم به Pest به عنوان فریمورک تست پیش فرض رای دادند، بنابراین تغییر یافت.

دیتابیس پیش فرض: SQLite

دیتابیس پیش فرض برای لاراول به SQLite تغییر یافته است. می توانید درخواست pull SQLite for local dev را بررسی کنید.

5. دستورات جدید “make:xxxxx”

لاراول 11 با دستورات artisan جدید make: همراه است. اکنون می توانید enum، interface و classes ایجاد کنید.

php artisan make:enum
php artisan make:class
php artisan make:interface

می توانید syntax دستورات را در درخواست های pull گیت هاب بررسی کنید:

6. بررسی سلامت (Health Check)

لاراول 11 با یک مسیر رجیستر شده جدید /up همراه است.

bootstrap/app.php:

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        channels: __DIR__.'/../routes/channels.php',
        health: '/up', 
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

لاراول هنگام تنظیم مسیرها، مسیر Health را تعریف می کند و ایونت DiagnosingHealth را فعال می کند.

src / Illuminate / Foundation / Configuration / ApplicationBuilder.php:

use Illuminate\Foundation\Events\DiagnosingHealth;
use Illuminate\Support\Facades\View;
 
class ApplicationBuilder
{
    // ...
 
    protected function buildRoutingCallback(?string $web,
        ?string $api,
        ?string $pages,
        ?string $health,
        string $apiPrefix,
        ?callable $then)
    {
        return function () use ($web, $api, $pages, $health, $apiPrefix, $then) {
            if (is_string($api) && realpath($api) !== false) {
                Route::middleware('api')->prefix($apiPrefix)->group($api);
            }
 
            if (is_string($health)) { 
                Route::middleware('web')->get($health, function () {
                    Event::dispatch(new DiagnosingHealth);
 
                    return View::file(__DIR__.'/../resources/health-up.blade.php');
                });
            } 
 
            if (is_string($web) && realpath($web) !== false) {
                Route::middleware('web')->group($web);
            }
 
            if (is_string($pages) &&
                realpath($pages) !== false &&
                class_exists(Folio::class)) {
                Folio::route($pages, middleware: $this->pageMiddleware);
            }
 
            if (is_callable($then)) {
                $then($this->app);
            }
        };
    }
 
    // ...
}

مسیر /up زمان پاسخ را برمی‌گرداند:

مسیر Health

7. Dumpable Trait

لاراول 11 Trait جدیدی به نام Dumpable معرفی می کند. این Trait برای جایگزینی متدهای فعلی dd() و dump() در اکثر کلاس های فریم ورک در نظر گرفته شده است. کاربران و نویسندگان پکیج می توانند از این Trait برای اشکال زدایی آسان‌تر کد استفاده کنند.

در اینجا یک مثال از نحوه استفاده آورده شده است:

use Illuminate\Support\Traits\Conditionable;
use Illuminate\Support\Traits\Dumpable;
 
class Address
{
    use Conditionable, Dumpable;
 
    // ...
}
$address = new Address;
 
$address->setThis()->setThat(); 
$address->setThis()->dd()->setThat(); 

درخواست pull را در گیت هاب ببینید: [11.x] Adds Dumpable concern

8. Limit Eager Load

لاراول 11 بدون نیاز به پکیج های خارجی، امکان محدود کردن رکوردهای eagerly loaded را فراهم می‌کند.

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}
class Post extends Model
{
    // ...
}
$users = User::with(['posts' => function ($query) {
    $query->latest()->limit(10); 
}])->get();

قبل از لاراول 11، شما به یک پکیج جداگانه به نام Eloquent Eager Limit از Jonas Staudenmeir نیاز داشتید.

درخواست pull را در گیت هاب ببینید: [11.x] Support eager loading with limit.

9. متد Casts

از لاراول 11، casts به جای پراپرتی $casts در متدcasts() ارائه خواهند شد.

class User extends Authenticatable
{
    // ...
 
    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }
}

همچنین، حالا می توان یک آرایه را ارائه داد.

protected function casts(): array
{
    return [
        'bookOptions' => [AsCollection::class, OptionCollection::class],
    ];
}

این تغییر مشکلی به وجود نمی آورد. شما فقط باید بدانید که متد casts() بر پراپرتی $casts اولویت دارد.

درخواست pull را در گیت هاب ببینید: [11.x] Adds Model::casts() method and named static methods for built-in casters.

10. متد once()

یک تابع حافظه ای جدید به نام once() ایجاد شده است. این تابع تضمین می‌کند که یک callable فقط یک بار فراخوانی شود و در فراخوانی‌های بعدی همان نتیجه را برگرداند.

class User extends Model
{
    public function stats(): array
    {
        return once(function () {
            // Expensive operations to generate user stats, multiple db queries, etc...
 
            return $stats;
        });
    }
}

در اینجا نحوه عملکرد آن آمده است:

  1. اولین بار که stats() را فراخوانی می‌کنید، تابع قابل فراخوانی که به once() منتقل می‌شود، اجرا می‌شود.
  2. نتیجه تابع قابل فراخوانی ذخیره می شود.
  3. دفعات بعدی که stats() را فراخوانی می‌کنید، نتیجه ذخیره شده بازگردانده می‌شود. تابع قابل فراخوانی دوباره اجرا نمی‌شود.
// با فرض اینکه دو نمونه User دارید: $userA و $userB

$userA->stats(); // تابع قابل فراخوانی اجرا می شود
$userA->stats(); // نتیجه ذخیره شده از خط قبلی بازگردانده می شود...

$userB->stats(); // از نتایج ذخیره شده $userA استفاده نمی شود، زیرا $userB !== $userA
$userB->stats(); // نتیجه ذخیره شده از خط قبلی بازگردانده می شود...

درخواست pull را در گیت هاب ببینید: [11.x] Adds once memoization function.

11. صفحه خوش‌آمدگویی لاراول 11

لاراول 11 با یک صفحه خوش‌آمدگویی جدید ارائه می‌شود. تصاویر زیر نشان می‌دهند که در حالت روشن و تاریک چگونه به نظر می‌رسد.

صفحه خوش آمد گویی لاراول 11
صفحه خوش آمد گویی لاراول 11 تیره

12. حداقل نسخه PHP مورد نیاز: 8.2

مهمترین نکته: لاراول 11 دیگر از PHP 8.1 پشتیبانی نمی کند. در حال حاضر، PHP 8.2 حداقل نسخه مورد نیاز است. درخواست pull را در گیت هاب ببینید: [11.x] Drop PHP 8.1 support.

راهنمای ارتقا و/یا شیفت

بنابراین، اگر می‌خواهید برنامه‌های خود را به لاراول 11 ارتقا دهید و از ویژگی‌های جدید استفاده کنید، راهنمای ارتقا در مستندات رسمی را مطالعه کنید. یا اگر می‌خواهید فرآیند ارتقا را خودکار کنید، می‌توانید از سرویسی مانند Laravel Shift استفاده کنید.

به خاطر داشته باشید که تغییرات ساختاری اختیاری هستند، عملکرد سینتکس قدیمی همچنان کار می‌کند و حذف یا منسوخ نشده است. بنابراین می‌توانید پروژه خود را به لاراول 11 ارتقا دهید و همچنان از ساختار پوشه/کد قدیمی استفاده کنید.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *