چی به Laravel 13.22 تا 13.25 اضافه شده؟
حدود ۷ دقیقه مطالعه
توی نوشته های قبلی ورژن 13.20 و 13.21 لاراول رو بررسی کردیم.این بار میخوایم ۴ تا نسخه دیگه رو که بعد از اونها منتشر شدند رو بررسی کنیم. تو این چهار نسخه، لاراول چند تا ویژگی واقعاً کاربردی گرفته: از یه attribute جدید برای binding شرطی تو container، تا سیستم کامل توقف صفها موقع دیپلوی، و یه رابط ترمینال جدید برای دستور artisan dev. بریم سراغ نسخهبهنسخه.
اگر میخوای میتونی مقاله های قبلی رو اینجا بخونی
Laravel 13.22 (24 جولای 2026)
اتریبیوت #[BindWhen] برای binding شرطی
تا الان attribute #[Bind] فقط یه پارامتر environments برای شرطی کردن binding داشت. حالا #[BindWhen] یه closure میگیره که خود container رو دریافت میکنه، پس میتونی binding رو بر اساس config یا feature flag تصمیم بگیری:
use Illuminate\Container\Attributes\Bind;
use Illuminate\Container\Attributes\BindWhen;
#[BindWhen(BetaPaymentGateway::class, static function ($container) {
return $container->make('config')->get('features.payments.beta');
})]
#[Bind(FakePaymentGateway::class, environments: ['local', 'testing'])]
#[Bind(StripePaymentGateway::class)]
interface PaymentGatewayInterface {}
این attribute تکرارپذیره و شرطها به ترتیب تعریف بررسی میشن، پس میشه چند تا شرط رو قبل از یه #[Bind] پیشفرض گذاشت. نکتهی مهم: چون از closure تو آرگومان attribute استفاده میکنه، به PHP 8.5 نیاز داره.
فیک کردن DNS lookup تو validation
قانون active_url و گزینهی dns تو قانون email، واقعاً یه DNS query میزنن؛ یعنی هر تستی که اینها رو صدا بزنه، به شبکه وابسته میشه و ممکنه گاهی بیدلیل fail کنه. متد جدید Validator::fakeDnsLookups() این lookup رو دور میزنه ولی بقیهی منطق validation دستنخورده میمونه:
protected function setUp(): void
{
parent::setUp();
Validator::fakeDnsLookups();
}
پشتیبانی #[Delay] تو batch و bulk dispatch
جابهایی که با attribute #[Delay] تأخیرشون رو مشخص میکردن، وقتی جدا dispatch میشدن درست کار میکردن، ولی Bus::batch() و Queue::bulk() فقط پراپرتی $delay رو میخوندن و این attribute رو نادیده میگرفتن. حالا هر دو مسیر یکسان رفتار میکنن.
چند صف همزمان تو queue:clear
php artisan queue:clear redis --queue=high,low,emails
حالا میشه چند تا اسم صف رو با کاما جدا کرد، دقیقاً همون رفتاری که تو queue:work و queue:listen از قبل بود.
Laravel 13.23 (27 جولای 2026)
درایور لاگ ماهانه
درایور daily برای اپهایی که لاگ زیاد تولید میکنن مناسبه؛ ولی اپهای کوچیکتر با یه پوشه پر از فایلهای تقریباً خالی مواجه میشدن. درایور جدید monthly دقیقاً بین single و daily قرار میگیره و یه فایل به ازای هر ماه تقویمی میسازه:
'monthly' => [
'driver' => 'monthly',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'max_files' => 3,
'replace_placeholders' => true,
],
پیشفرض نگهداری برای daily هنوز ۱۴ فایله، ولی برای monthly فقط ۳ فایل.
پشتیبانی از SES tenant تو SES v2
اگه از Amazon SES tenants استفاده میکنی (که reputation و تنظیمات رو بین گروههای مختلف فرستنده ایزوله میکنه)، حالا میشه هدر X-SES-TENANT-NAME رو مستقیم از خود mailable ست کرد:
public function headers(): Headers
{
return new Headers(text: ['X-SES-TENANT-NAME' => 'tenant-id']);
}
کلوز ->using() برای تغییر ستون تو PostgreSQL
PostgreSQL بدون یه cast صریح، از تغییر نوع یه ستون به یه نوع ناسازگار امتناع میکنه. حالا میشه این cast رو مستقیم تو migration مشخص کرد:
Schema::table('currency_rates', function (Blueprint $table) {
$table->date('name')->using('name::date')->change();
});
این کلوز فقط برای PostgreSQL اعمال میشه؛ بقیهی grammar ها نادیدهاش میگیرن.
مقایسهی timing-safe برای secret بایپس maintenance mode
مقایسهی secret تو middleware و بوتاسترپ maintenance mode از === به hash_equals() تغییر کرد؛ یه بهبود دفاعدر-عمق، نه رفع یه باگ عملاً قابل سوءاستفاده.
Laravel 13.24 (4 آگوست 2026)
تشخیص رنگ غالب تصویر و پشتیبانی از HEIC
API تصویرسازی لاراول حالا میتونه رنگ غالب یه تصویر رو تشخیص بده، و از این رنگ بهعنوان پسزمینهی پیشفرض تو متدهای contain() و rotate() استفاده میکنه. علاوه بر این، ورودی AVIF و HEIC، خروجی toHeic()، و پشتیبانی از هر دو فرمت تو قانون validation تصویر هم اضافه شده.
متد modelKeys() روی Eloquent query builder
یه متد کمکی جدید برای گرفتن سریع کلیدهای مدل از یه کوئری، بدون نیاز به pluck('id') دستی.
قانون validation جدید array_keys
یه قانون جدید که کلیدهای غیرمنتظرهی یه آرایه رو رد میکنه، همراه با یه placeholder به اسم :unexpected تو پیام خطا.
رفع باگ کندی validation روی wildcard
قانونهای تو دل الگوهای foo.*.bar تو آرایههای بزرگ، یه رفتار expansion درجهدومی (quadratic) داشتن که میتونست یه request رو بیش از یک دقیقه معطل کنه. این باگ حالا رفع شده.
Laravel 13.25 (11 آگوست 2026)
توقف همهی صفها با یه دستور
قبلاً باید هر صف رو جدا-جدا و بر اساس نام pause میکردی، که تو یه دیپلوی با دوجین worker پخششده رو صفهای مختلف، کار خستهکنندهای بود. حالا هر دو دستور یه فلگ --all میگیرن:
php artisan queue:pause --all
php artisan queue:resume --all
همون قابلیت رو فساد هم داره:
use Illuminate\Support\Facades\Queue;
Queue::pauseAll();
Queue::resumeAll();
این سوییچ سراسری کاملاً مستقل از pause های تکی عمل میکنه؛ یعنی resumeAll() فقط فلگ سراسری رو پاک میکنه و صفهایی که جدا pause کرده بودی، pause شده باقی میمونن. این طراحی عمدیه تا یه اسکریپت دیپلوی بهطور تصادفی صفی که یکی عمداً نگه داشته رو دوباره فعال نکنه.
artisan dev با یه رابط ترمینال جدید
قبلاً artisan dev از پکیج concurrently استفاده میکرد که همهی پردازشها رو تو یه فید مشترک قاطی میکرد. حالا از یه رابط جدید به اسم @laravel/multiplex استفاده میکنه که هر پردازش تب جدا خودش رو داره، امکان جستوجو، ریاستارت جدا، و ریاستارت خودکار در صورت کرش رو میده:
php artisan dev --stream
php artisan dev --timestamps --no-restart
توجه داشته باش که این ویژگی فعلاً فقط رو مک و لینوکس کار میکنه (ویندوز به همون concurrently قدیمی برمیگرده) و حداقل نسخهی Node.js لازم برای این مسیر جدید، نسخهی ۲۲.۱۳ است.
برگردوندن مستقیم Image از یه route
کلاس Image حالا اینترفیس Responsable رو پیادهسازی میکنه، پس میشه مستقیم از یه route برگردوندش:
Route::get('/avatars/{user}', function (User $user) {
return Image::fromStorage($user->avatar_path)
->cover(200, 200)
->toWebp()
->quality(80);
});
هدر Content-Type هم متناسب با فرمت خروجی pipeline تنظیم میشه، نه فرمت فایل اصلی. علاوه بر این، Image::fromStream() هم اضافه شده که یه instance رو مستقیم از یه stream resource میسازه.
withoutCookies() روی response ها
بهجای زنجیره کردن withoutCookie() برای هر کوکی جدا، حالا یه فرم جمع هم هست:
return response('OK')->withoutCookies(['session', 'tracking', 'preferences']);
کمککنندهی schema جدید foreignUlidFor()
foreignIdFor() و foreignUuidFor() از قبل بودن؛ حالا سهتایی کامل شده:
$table->foreignUlidFor(User::class)->constrained();
Request::all() حالا اولویت رو به input میده
قبلاً وقتی یه فیلد input و یه فایل آپلودی همنام بودن، آرایهی نهایی، شیء UploadedFile رو نگه میداشت. حالا این ترتیب برعکس شده و مقدار input برنده میشه؛ file() تحت تأثیر این تغییر قرار نمیگیره.
جمعبندی
اگه بخوایم این چهار نسخه رو تو یه جمله خلاصه کنیم: تمرکز اصلی روی صفها (پشتیبانی کاملتر از #[Delay]، pause سراسری، رویدادهای observability بیشتر)، بهبودهای مربوط به تصویر (HEIC، رنگ غالب، برگردوندن مستقیم از route)، و صیقل دادن تجربهی توسعهدهنده با artisan dev بوده. هیچکدوم از این چهار نسخه breaking change جدی برای اپلیکیشنهای معمولی نداشتن، پس آپدیت کردن نسبتاً بیدردسره؛ فقط اگه از #[BindWhen] استفاده میکنی، حواست به نیاز PHP 8.5 باشه.
