لاراول ۱۳.۲۱ و اتریبیوت RouteKey
خلاصهٔ کاملتر
تیم لاراول در ۲۱ جولای ۲۰۲۶ نسخهٔ v13.21.0 و پشتبندش v13.21.1 رو تگ زد؛ به نوشتهٔ Laravel News اون تگ دوم فقط ثابت نسخهٔ فریمورک رو بالا میبره، برای همین هر دو با هم بررسی شدن. سرِ فهرست تغییرها یه اتریبیوت کلاسی جدید برای Eloquent نشسته.
تا امروز اگه میخواستی route model binding به جای شناسهٔ اصلی روی یه ستون دیگه مثل slug انجام بشه، باید متد getRouteKeyName() رو تو مدل override میکردی. حالا دقیقاً مثل الگویی که #[ObservedBy] و #[ScopedBy] ساختن، میشه همین رو بالای کلاس اعلام کرد:
use Illuminate\Database\Eloquent\Attributes\RouteKey;
#[RouteKey('slug')]
class Post extends Model
{
// ...
}با این اتریبیوت، باندینگ ضمنی مدل Post رو از روی ستون slug پیدا میکنه و اگه اتریبیوتی نباشه، getRouteKeyName() مثل قبل به کلید اصلی برمیگرده. یعنی رفتار قدیمی نمیشکنه و فقط یه راه تمیزتر اضافه شده.
دومین اضافهشده قانون اعتبارسنجی base64 ـه؛ جای خالیای که کتابخونههایی مثل Zod خیلی وقته پرش کردن. این قانون چک میکنه مقدار یه رشتهٔ Base64 معتبر طبق RFC 4648 باشه، اونم به شکل canonical: باید تو حالت strict دیکد بشه و دوباره که انکد شد، دقیقاً همون رشتهٔ اول در بیاد. پس اشتباه تو padding یا کاراکتر اضافه، رد میشه.
اتریبیوت contextual جدید #[RequestAttribute] هم برای همون سناریوی آشناست که میدلور یه آبجکت (مثلاً tenant یا سازمانی که از روی API key پیدا شده) رو روی attribute bag ریکوئست میذاره و بعد باید دستی $request->attributes->get() صداش کنی. حالا مستقیم تزریق میشه:
use Illuminate\Container\Attributes\RequestAttribute;
class InventoryController
{
public function index(#[RequestAttribute('org')] Organization $org)
{
return $this->inventoryService->getForOrg($org);
}
}کامپوننت Image که تو ۱۳.۲۰ اومده بود، تا حالا فقط WebP و JPG و JPEG رو با متدهای fluent میساخت، درحالیکه انکدرهای Intervention Image بیشتر از اینها بلد بودن. حالا toPng() و toGif() و toAvif() و toBmp() اضافه شدن و در ضمن Image::extension() که نگاشت image/avif رو نداشت و برای خروجی AVIF پسوند .bin میساخت هم درست شده.
بقیهٔ تغییرها ریزتر ولی بهدردبخورن: پراپرتی استاتیک $applicationBuilder اجازه میده پکیجهایی که Application رو گسترش میدن بیلدر خودشون رو بدون بازنویسی کل Application::configure() جا بزنن، کامپوننت Illuminate\Concurrency صاحب subsplit مستقل شد، کالبکهای rollback تراکنش دیتابیس درست اجرا میشن، پیام InvalidPayloadException حالا اسم جاب و صف رو هم میگه و Str::wordWrap() با رشتههای چندبایتی کنار میاد.
نکات کلیدی:
- اتریبیوت #[RouteKey] جایگزین تمیزِ override کردن getRouteKeyName() برای route model binding
- قانون اعتبارسنجی base64 با چک سختگیرانهٔ RFC 4648 و انکدینگ canonical
- اتریبیوت #[RequestAttribute] برای تزریق مستقیم مقدارهای attribute bag ریکوئست
- خروجی PNG، GIF، AVIF و BMP برای کامپوننت Image و رفع باگ پسوند AVIF
- بیلدر اپلیکیشن قابل جایگزینی و subsplit مستقل برای Illuminate\Concurrency




