Команда Laravel випустила версію v12.20.0, яка містить нові можливості, зокрема: обробку помилок під час обмеження викликів, метод fakeFor
у фасаді Queue, метод Context::remember()
, а також можливість налаштування pluck()
у колекціях за допомогою колбеків та інше:
Ben Askew додав функції remember()
та rememberHidden()
, які зберігають результат наданої замикальної функції у контексті, якщо він ще не доданий, і завжди повертають цей результат:
// До
if (Context::has('user-permissions')) {
$permissions = Context::get('user-permissions');
} else {
$permissions = auth()->user()->permissions;
Context::set('user-permissions', $permissions);
}
// Після
$permissions = Context::remember('user-permissions', fn() => auth()->user()->permissions);
Деталі у Pull Request #56156.
Balboa Codes додав методи doesntStartWith()
та doesntEndWith()
до класів Str
та Stringable
, які є протилежними startsWith()
та endsWith()
. Ви можете порівнювати значення з іншим рядком або масивом рядків:
use Illuminate\Support\Str;
Str::doesntEndWith('Це моє ім’я', 'пес'); // true
Str::doesntEndWith('Це моє ім’я', ['ім’я', 'foo']); // false
Str::doesntStartWith('Це моє ім’я', 'Те'); // true
Str::doesntStartWith('Це моє ім’я', ['Це', 'Те', 'Там']); // false
Деталі у Pull Request #56168 та в документації Strings.
Michael Dzjaparidze додав метод failWhen()
до middleware ThrottlesExceptions
:
Цей middleware зараз дозволяє видаляти завдання лише при виникненні певного виключення. Іноді потрібно позначити завдання як невдале. Наприклад, під час виконання ланцюга завдань бажано зупинити виконання при виникненні виключення.
Ось приклад:
public function middleware(): array
{
return [
(new ThrottlesExceptions(2, 10 * 60))
->deleteWhen(CustomerDeletedException::class)
->failWhen(fn (\Throwable $e) => /* ... */)
];
}
Деталі у Pull Request #56180. Додаткову інформацію можна знайти в документації Queues.
Punyapal Shah додав нові методи до фасаду Queue, які слідують тому ж шаблону, що і фасад Event:
// До: Фейк впливає на весь тест
Queue::fake();
// ... тестовий код ...
// Необхідно вручну очищати
// Після: Фейк обмежений
Queue::fakeFor(function () {
Queue::push(new ProcessPayment);
Queue::assertPushed(ProcessPayment::class);
}); // Оригінальна черга автоматично відновлена
// Вибірковий фейк завдань
// Дозволити критичним завданням ставитися до черги без обмежень, фейкувати інші
Queue::fakeExceptFor(function () {
Queue::push(new CriticalSystemJob); // Дійсно додано до черги
Queue::push(new EmailNotification); // Фейк
Queue::assertNotPushed(CriticalSystemJob::class);
Queue::assertPushed(EmailNotification::class);
}, [CriticalSystemJob::class]);
Деталі у Pull Request #56149.
@devajmeireles додав інтерфейс JsonSerializable
, щоб забезпечити правильне перетворення класу Uri
на JSON:
// Приклад
Route::get('/testing', function () {
return User::first()->only('id', 'url');
});
/* До {"id": 1, "url": {}} */
/* Після {"id": 1, "url": "https://sanford.biz/..."} */
Деталі у Pull Request #56097.
Volodya Kurshudyan представив контракт Iterable
для класу Fluent
, що вирішує невелику проблему при використанні Fluent в циклах:
// Необхідно викликати toArray() для ітерації
foreach ($user->settings->toArray() as $key => $value) {
//
}
// Тепер властивість `settings` ітерується в Laravel 12.20
foreach ($user->settings as $key => $value) {
//
}
Деталі у Pull Request #56218.
Kennedy Tedesco додав метод collection()
, який повертає екземпляр колекції з репозиторію конфігурацій:
// До
collect(Config::array('my_file.my_key'));
// Після
Config::collection('my_file.my_key');
Деталі у Pull Request #56200.
Ralph J. Smit оновив метод pluck()
, щоб дозволити налаштування ключів та значень:
Цей PR додає підтримку замикань для параметрів
$key
/$value
методівpluck()
. Часто я майже можу використовувати pluck(), але потребую незначної модифікації ключа або значення. Я повинен вирішувати це за допомогою mapWithKeys(), але це повторює id й робить код занадто обтяжливим, коли потрібно тільки застосувати форматування.
Тепер ви можете робити ось так:
Country::get()
->pluck(fn (Country $country) => "{$country->flag} {$country->name}", 'id');
Деталі у Pull Request #56188.
Martin Bean додав директиву @context
для визначення, чи існує значення в контексті:
@context('canonical')
@endcontext
Деталі у Pull Request #56146.
Ви можете переглянути повний список нових функцій та оновлень нижче, а також порівняти різницю між 12.19.0 та 12.20.0 на GitHub. Нижче наведені примітки до випуску, безпосередньо з чэнджлогу:
offset()
замість skip()
від @browner12 в https://github.com/laravel/framework/pull/56081limit()
замість take()
від @browner12 в https://github.com/laravel/framework/pull/56080offset()
та limit()
в тестах від @browner12 в https://github.com/laravel/framework/pull/56089JsonSerializable
до класу Uri
від @devajmeireles в https://github.com/laravel/framework/pull/56097$this
, встановити тип повернення на static
від @browner12 в https://github.com/laravel/framework/pull/56092int<0, max>
як тип повернення у документації для операцій бази даних, які повертають кількість від @cosmastech в https://github.com/laravel/framework/pull/56117Collection
від @cosmastech в https://github.com/laravel/framework/pull/56135--model
та --except
через команду PruneCommand
від @hosni в https://github.com/laravel/framework/pull/56140Htmlable
екземплярів до Js::from()
від @jj15asmr в https://github.com/laravel/framework/pull/56159$key
/$value
в методі pluck()
колекцій від @ralphjsmit в https://github.com/laravel/framework/pull/56188collection()
до репозиторію конфігурацій від @KennedyTedesco в https://github.com/laravel/framework/pull/56200Request
від @duncanmcclean в https://github.com/laravel/framework/pull/56230Fluent
ітерованим від @xurshudyan в https://github.com/laravel/framework/pull/56218@context
Blade від @martinbean в https://github.com/laravel/framework/pull/56146withLocale
та withCurrency
завжди відновлювали попередній стан від @xurshudyan в https://github.com/laravel/framework/pull/56234