لاراول ۱۳.۳۳: کش memoized حالا تگ میگیره
خلاصهٔ کاملتر
تیم لاراول نسخه ۱۳.۳۳.۰ رو منتشر کرده و به نوشته لاراول نیوز، دوتا تغییر بیشتر از بقیه به چشم میاد: کش memoized حالا تگ قبول میکنه، و یه اتریبیوت جدید به اسم Refreshes ستونهایی که خود دیتابیس مقدارشون رو حساب میکنه بعد از هر نوشتن تازه میکنه. باقی تغییرها هم بیشتر دور مایگریشن، صف و تست میچرخن.
کش memoized (یعنی لایهای که جواب یه کلید رو تو همون ریکوئست تو حافظه نگه میداره تا دوباره نری سراغ Redis) تا حالا با کش تگدار کار نمیکرد. Joost de Bruijn متد tags() رو بهش اضافه کرده، پس دو بار خوندن یه کلید فقط یه بار به Redis میزنه و flush کردن تگ نسخه توی حافظه رو هم پاک میکنه. قبلش باید دستی دور کش تگدار یه Cache::store('array') میپیچیدی.
// Two calls, one round trip to Redis
Cache::memo()->tags(['permissions'])->get("permissions:{$user->id}");
Cache::memo()->tags(['permissions'])->get("permissions:{$user->id}");
// Flushing the tag also clears the memoized entries
Cache::memo()->tags(['permissions'])->flush();اتریبیوت #[Refreshes] که Caleb White فرستاده، به درد ستونهای virtualAs و storedAs میخوره؛ یعنی ستونهایی که مقدارشون رو خود دیتابیس میسازه. تا قبل از این، بعد از create() این ستونها روی مدلِ توی حافظه خالی یا قدیمی میموندن مگه اینکه خودت refresh() صدا بزنی. حالا لاراول فقط همون ستونهای لیستشده رو با یه کوئری روی کانکشن نوشتن میخونه، پس دیگه لازم نیست دستی مدل رو تازه کنی.
#[Refreshes('name')]
class User extends Model {}
$user = User::create(['first_name' => 'Taylor', 'last_name' => 'Otwell']);
$user->name; // "Taylor Otwell" without calling refresh()از بقیه تغییرها، مودیفایر inplace() و lock() برای ایندکس و فارنکی اضافه شده تا تو MySQL بتونی ALGORITHM=INPLACE و LOCK=NONE بخوای و جدول موقع مایگریشن قفل نشه. کنارش Worker::$killOnTimeout اومده: اگه false بذاریش، جابی که تایماوت میشه دیگه کل پروسه ورکر رو نمیکشه و به جاش TimeoutExceededException پرت میشه تا جاب فرصت تمیزکاری داشته باشه. مقاله هشدار میده که یه try/catch پهن تو handle() میتونه همین اکسپشن رو قورت بده.
نکات کلیدی:
- نسخه ۱۳.۳۳.۰ روی شاخه ۱۳.x منتشر شده
- Cache::memo()->tags([...]) حالا کار میکنه (PR شماره ۶۱۵۹۳)
- #[Refreshes('name')] فقط ستونهای لیستشده رو با یه کوئری روی کانکشن نوشتن میخونه
- inplace() روی index()، unique()، primary()، fullText()، spatialIndex() و foreign() کار میکنه
- AsCollection::nullable() به جای رشته "null" یه NULL واقعی تو دیتابیس میذاره تا whereNull() درست جواب بده
- اتریبیوتهای فرمریکوئست مثل #[StopOnFirstFailure] حالا از کلاس والد به ارث میرسن
- mockArtisan() و realArtisan() جای بازی با $mockConsoleOutput تو تستها رو گرفتن




