Codoloper

لاراول ۱۳.۲۱ منتشر شد: ویژگی RouteKey، اعتبارسنجی Base64 و فرمت‌های تصویری بیشتر

لاراول ۱۳.۲۱ منتشر شد: ویژگی RouteKey، اعتبارسنجی Base64 و فرمت‌های تصویری بیشتر | عکس
لاراول ۱۳.۲۱ در تاریخ ۲ جولای ۲۰۲۶ منتشر شد و مجموعه‌ای از ویژگی‌های کاربردی را برای توسعه‌دهندگان به ارمغان آورده است. این نسخه شامل اتریبیوت‌های جدیدی برای ساده‌سازی کار با مدل‌ها و درخواست‌ها، قانون اعتبارسنجی base64 که مدت‌ها جای خالی آن احساس می‌شد، و پشتیبانی از فرمت‌های تصویری بیشتر در کامپوننت Image است.
در این مقاله، تمام ویژگی‌های جدید، بهبودها و اصلاحات این نسخه را به صورت کامل بررسی می‌کنیم.

اتریبیوت #[RouteKey] برای مدل‌های Eloquent

یکی از جذاب‌ترین ویژگی‌های این نسخه، اضافه شدن اتریبیوت #[RouteKey] است که کار با Route Model Binding را بسیار ساده‌تر می‌کند.

مشکل قدیمی، راه‌حل جدید

تا پیش از این، اگر می‌خواستید از ستون دیگری غیر از id برای Route Model Binding استفاده کنید، مجبور بودید متد getRouteKeyName() را در مدل خود بازنویسی کنید:
 
class Post extends Model
{
    public function getRouteKeyName()
    {
        return 'slug';
    }
}
اما در لاراول ۱۳.۲۱، می‌توانید از اتریبیوت #[RouteKey] استفاده کنید که بسیار تمیزتر و خواناتر است:
use Illuminate\Database\Eloquent\Attributes\RouteKey;

#[RouteKey('slug')]
class Post extends Model
{
    // ...
}
با این کار، وقتی در روت‌های خود از Post استفاده می‌کنید، لاراول به صورت خودکار بر اساس ستون slug جستجو می‌کند. اگر این اتریبیوت وجود نداشته باشد، لاراول به صورت پیش‌فرض از id استفاده می‌کند.
این ویژگی توسط @nimnaherath در PR #60841 اضافه شده است.

قانون اعتبارسنجی base64

بالاخره لاراول یک قانون اعتبارسنجی اختصاصی برای رشته‌های base64 اضافه کرد! این ویژگی مدت‌ها در لیست درخواست‌های توسعه‌دهندگان بود.

نحوه استفاده

 
$request->validate([
    'signature' => ['required', 'base64'],
]);

چرا این ویژگی مهم است؟

بسیاری از APIها و سرویس‌ها از base64 برای ارسال داده‌های باینری استفاده می‌کنند. تا پیش از این، توسعه‌دهندگان مجبور بودند از اعتبارسنجی‌های سفارشی یا پکیج‌های جانبی استفاده کنند. اما حالا لاراول به صورت داخلی این قابلیت را پشتیبانی می‌کند.
این قانون به صورت strict کار می‌کند:
  • رشته باید به درستی decode شود
  • پس از decode و encode مجدد، باید دقیقاً همان رشته اولیه تولید شود
  • این یعنی اشتباهات Padding یا کاراکترهای اضافی به راحتی شناسایی می‌شوند
این ویژگی توسط @lucasmichot در PR #60808 اضافه شده است.

اتریبیوت زمینه‌ای #[RequestAttribute]

این یکی از کاربردی‌ترین ویژگی‌های این نسخه برای کسانی است که با Middlewareهای سفارشی کار می‌کنند.

مشکل چیست؟

وقتی یک Middleware مقدارهایی را روی $request->attributes ذخیره می‌کند (مثلاً اطلاعات سازمان یا Tenant بر اساس API Key)، برای دسترسی به آن‌ها در کنترلر باید از روش‌های دستی استفاده کنید:
public function index(Request $request)
{
    $org = $request->attributes->get('org');
    // ...
}

راه‌حل جدید

با اتریبیوت #[RequestAttribute] می‌توانید این مقادیر را به صورت خودکار inject کنید:
use Illuminate\Container\Attributes\RequestAttribute;

class InventoryController
{
    public function index(
        #[RequestAttribute('org')] Organization $org
    ) {
        return $this->inventoryService->getForOrg($org);
    }
}
این ویژگی کد شما را تمیزتر می‌کند و از الگوی Dependency Injection به بهترین شکل استفاده می‌کند. این ویژگی توسط @cosmastech در PR #60847 اضافه شده است.

فرمت‌های خروجی بیشتر برای کامپوننت Image

کامپوننت Image که در لاراول ۳.۲۰ معرفی شد، در این نسخه قابلیت‌های بیشتری پیدا کرده است.

چه چیزی اضافه شده؟

تا پیش از این، کامپوننت Image فقط می‌توانست خروجی WebP، JPG و JPEG تولید کند. اما حالا متدهای زیر اضافه شده‌اند:
  • toPng()
  • toGif()
  • toAvif()
  • toBmp()

مثال استفاده

use Illuminate\Support\Facades\Image;

Image::fromUpload($request->file('avatar'))
    ->cover(400, 400)
    ->toAvif()
    ->quality(80)
    ->store('avatars');

اصلاح باگ مهم

این نسخه همچنین باگ Image::extension() را برطرف کرده است که قبلاً نگاشت MIME type برای image/avif را نداشت و برای فایل‌های AVIF پسوند .bin تولید می‌کرد!
این ویژگی توسط @Tresor-Kasenda در PR #60713 اضافه شده است.

Application Builder قابل شخصی‌سازی

این یک بهبود فنی برای توسعه‌دهندگان پکیج است.

چه تغییری ایجاد شده؟

قبلاً متد Application::configure() کلاس ApplicationBuilder را به صورت hardcode شده استفاده می‌کرد. این یعنی اگر پکیجی می‌خواست Application لاراول را extend کند، مجبور بود کل متد را بازنویسی کند.
حالا یک protected static property به نام $applicationBuilder اضافه شده که به subclassها اجازه می‌دهد کلاس Builder سفارشی خود را ارائه دهند بدون اینکه نیاز باشد کل API را تغییر دهند.
این بهبود در PR #60848 اضافه شده است.

Subsplit کامپوننت Concurrency

کامپوننت Illuminate\Concurrency حالا به صورت یک subsplit جداگانه منتشر می‌شود. این یعنی توسعه‌دهندگان می‌توانند این کامپوننت را به صورت یک پکیج مستقل (read-only) دریافت کنند، مشابه سایر کامپوننت‌های Illuminate.
این تغییر در PR #60836 انجام شده است.

سایر اصلاحات و بهبودها

این نسخه شامل تعداد زیادی اصلاح باگ و بهبودهای کوچک است که در ادامه بررسی می‌کنیم:

پایگاه داده

  • Callbackهای Rollback: callbackهای تراکنش‌های دیتابیس حالا به درستی فراخوانی می‌شوند (PR #60777)
  • Lost Connection: یک پیام خطای جدید برای از دست دادن اتصال شناسایی شده که امکان reconnect خودکار را فراهم می‌کند (PR #60819)
  • Question Marks: علامت سوال در Grammar::whereColumn() به درستی escape می‌شود (PR #60832)

لاگ و کش

  • LogManager: ارسال enum به LogManager::forgetChannel() دیگر TypeError نمی‌دهد (PR #60801)
  • RedisTaggedCache: متد decrement() حالا enum keys را به درستی مدیریت می‌کند (PR #60821)

رشته‌ها و Utilityها

  • Str::wordWrap(): حالا رشته‌های multibyte را به درستی مدیریت می‌کند (PR #60814)

اتریبیوت‌ها و Dependency Injection

  • Contextual Attribute Caching: کش کردن اتریبیوت‌های زمینه‌ای دیگر بین propertyهای یک کلاس تداخل ایجاد نمی‌کند (PR #60815)
  • Concurrency Exception: پارامترهای falsey در exceptionهای concurrency حفظ می‌شوند (PR #60822)

دستورات و Pipeline

  • Serve Command: پارس کردن پورت host در دستور serve اصلاح شده است (PR #60828)
  • Pipeline Hub: یک undefined index در Pipeline\Hub::pipe() برطرف شده است (PR #60802)

Jobها و Queue

  • InvalidPayloadException: پیام‌های این exception حالا نام job و queue را شامل می‌شوند که دیباگ را آسان‌تر می‌کند (PR #60799)

مقایسه با نسخه‌های قبلی

لاراول ۱۳.۲۱ ادامه مسیر بهبود تجربه توسعه‌دهنده است. اگر به نسخه ۱۳.۲۰ نگاه کنیم، می‌بینیم که تیم لاراول بر روی:
  • Developer Experience: اتریبیوت‌های جدید مثل #[RouteKey] و #[RequestAttribute] کد را خواناتر و نگهداری آن را آسان‌تر می‌کنند
  • Validation: اضافه شدن قانون base64 نشان می‌دهد که لاراول به نیازهای واقعی توسعه‌دهندگان گوش می‌دهد
  • Image Processing: پشتیبانی از فرمت‌های مدرن مثل AVIF نشان‌دهنده به‌روز بودن لاراول با استانداردهای وب است

مزایا و معایب به‌روزرسانی

مزایا:
  • کاهش کد boilerplate با اتریبیوت‌های جدید
  • اعتبارسنجی دقیق‌تر با قانون base64
  • انعطاف‌پذیری بیشتر در پردازش تصاویر
  • دیباگ آسان‌تر با پیام‌های خطای بهتر
ملاحظات:
  • این یک نسخه مینور است و تغییرات breaking change ندارد
  • برای استفاده از ویژگی‌های جدید، باید PHP 8.1 یا بالاتر داشته باشید (به دلیل استفاده از Attributes)

جمع‌بندی نهایی و نگاه شخصی

به عنوان یک توسعه‌دهنده لاراول، باید بگویم که نسخه ۱۳.۲۱ یکی از آن نسخه‌هایی است که واقعاً حس می‌کنید تیم لاراول به دقت به نیازهای روزمره ما گوش می‌دهد.
اتریبیوت #[RouteKey] چیزی است که سال‌ها منتظرش بودیم - بالاخره نیازی نیست برای یک تنظیم ساده، یک متد کامل را override کنیم. قانون base64 هم دقیقاً همان چیزی است که در پروژه‌های واقعی به آن نیاز داریم.
اما چیزی که من را بیشتر تحت تأثیر قرار داد، اصلاح باگ Image::extension() برای AVIF است. این نشان می‌دهد تیم لاراول نه تنها ویژگی‌های جدید اضافه می‌کند، بلکه به جزئیات و باگ‌های کوچک هم توجه می‌کند.
صادقانه بگویم، اگر از لاراول ۱۳ استفاده می‌کنید، این به‌روزرسانی را حتماً انجام دهید. هیچ ریسکی ندارد (چون breaking change نیست) و ویژگی‌های جدید آن واقعاً کار شما را آسان‌تر می‌کنند.

سوالات متداول

آیا این نسخه breaking change دارد؟
خیر، لاراول ۱۳.۲۱ یک نسخه مینور است و تمام ویژگی‌های جدید آن backward compatible هستند. می‌توانید بدون نگرانی به‌روزرسانی کنید.
آیا برای استفاده از اتریبیوت‌های جدید نیاز به PHP 8 دارم؟
بله، اتریبیوت‌های کلاس (Class Attributes) در PHP 8.0 معرفی شدند. برای استفاده از #[RouteKey] و #[RequestAttribute] باید حداقل PHP 8.0 داشته باشید.
آیا کامپوننت Image جایگزین Intervention Image شده است؟
خیر، کامپوننت Image لاراول در واقع یک wrapper حول Intervention Image است که API ساده‌تر و یکپارچه‌تری ارائه می‌دهد. شما همچنان می‌توانید مستقیماً از Intervention Image هم استفاده کنید.
چگونه به نسخه ۱۳.۲۱ به‌روزرسانی کنم؟
کافی است در فایل composer.json نسخه لاراول را به ^13.21 تغییر دهید و سپس دستور composer update را اجرا کنید.
کامنت جدید

برای ثبت کامنت وارد شوید

برای اینکه بتوانید زیر این پست کامنت بگذارید، باید وارد حساب کاربری خود شوید.

برای ادامه، وارد حساب خود شوید

بعد از ورود، دوباره به همین پست برمی‌گردید و می‌توانید کامنتتان را ثبت کنید.

ورود به حساب
کامنت‌ها

نظرات کاربران

دیدگاه‌هایی که برای این نوشته ثبت شده‌اند.

هنوز کامنتی برای این پست ثبت نشده است.