Команда 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.
# Додавання методу failWhen() до middleware ThrottlesExceptions
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.
# Додавання методів fakeFor() та fakeExceptFor() до фасаду Queue
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.
# Додавання інтерфейсу JsonSerializable до класу Uri
@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.
# Зробити клас Fluent ітерованим
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.
# Додавання методу collection() до репозиторію конфігурацій
Kennedy Tedesco додав метод collection(), який повертає екземпляр колекції з репозиторію конфігурацій:
// До
collect(Config::array('my_file.my_key'));
// Після
Config::collection('my_file.my_key');
Деталі у Pull Request #56200.
# Додавання підтримки Closure до методу pluck() колекцій
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.
# Директива Blade для перевірки контексту
Martin Bean додав директиву @context для визначення, чи існує значення в контексті:
@context('canonical')
@endcontext
Деталі у Pull Request #56146.
# Примітки до випуску
Ви можете переглянути повний список нових функцій та оновлень нижче, а також порівняти різницю між 12.19.0 та 12.20.0 на GitHub. Нижче наведені примітки до випуску, безпосередньо з чэнджлогу:
# v12.20.0
- [12.x] Передати TransportException в подію NotificationFailed від @hackel в https://github.com/laravel/framework/pull/56061
- [12.x] Використати
offset()замістьskip()від @browner12 в https://github.com/laravel/framework/pull/56081 - [12.x] Використати
limit()замістьtake()від @browner12 в https://github.com/laravel/framework/pull/56080 - [12.x] Відобразити назви черг завдань при запуску queue:work з опцією --verbose від @seriquynh в https://github.com/laravel/framework/pull/56086
- [12.x] Використати
offset()таlimit()в тестах від @browner12 в https://github.com/laravel/framework/pull/56089 - [12.x] Локалізувати aria-label для “Pagination Navigation” від @andylolz в https://github.com/laravel/framework/pull/56103
- [12.x] Покращити тестове покриття для Pipeline::through() від @azim-kordpour в https://github.com/laravel/framework/pull/56100
- [12.x] Додано інтерфейс
JsonSerializableдо класуUriвід @devajmeireles в https://github.com/laravel/framework/pull/56097 - [12.x] Відобразити назву з’єднання завдань при запуску queue:work з опцією --verbose від @amirhshokri в https://github.com/laravel/framework/pull/56095
- [12.x] Виправити PHPDoc для методу Arr::sole від @AhmedAlaa4611 в https://github.com/laravel/framework/pull/56096
- [12.x] Коли метод повертає
$this, встановити тип повернення наstaticвід @browner12 в https://github.com/laravel/framework/pull/56092 - [12.x] Використати
int<0, max>як тип повернення у документації для операцій бази даних, які повертають кількість від @cosmastech в https://github.com/laravel/framework/pull/56117 - [12.x] Додати відсутню @throws анотацію до Number від @AhmedAlaa4611 в https://github.com/laravel/framework/pull/56116
- [12.x] Виправити PHPDoc для типу callable у Arr::sole, щоб уникнути неоднозначності типу повернення від @AhmedAlaa4611 в https://github.com/laravel/framework/pull/56108
- Змінити типи повернення для через (пагінація) і трансформацію (колекція) від @glamorous в https://github.com/laravel/framework/pull/56105
- [12.x] Додати фасад режиму обслуговування для легшого розширення драйверів від @ziadoz в https://github.com/laravel/framework/pull/56090
- [12.x] Кешувати isSoftDeletable(), isPrunable() та isMassPrunable() безпосередньо в моделі від @shaedrich в https://github.com/laravel/framework/pull/56078
- [12.x] Throws not throw від @AhmedAlaa4611 в https://github.com/laravel/framework/pull/56120
- [12.x] Виправити @param документацію, щоб дозволити рядки від @AhmedAlaa4611 в https://github.com/laravel/framework/pull/56121
- [11.x] Передати лімітатор до when & report зворотніх викликів від @jimmypuckett в https://github.com/laravel/framework/pull/56129
- [12.x] Видалити опцію "prefix" для скидання паролів кешу від @browner12 в https://github.com/laravel/framework/pull/56127
- [12.x] Зробити Model::currentEncrypter публічним від @JaZo в https://github.com/laravel/framework/pull/56130
- [12.x] Додати анотацію throws від @amirhshokri в https://github.com/laravel/framework/pull/56137
- [12.x] Звузити цілісний діапазон для методів
Collectionвід @cosmastech в https://github.com/laravel/framework/pull/56135 - [12.x] Дозволити використовувати
--modelта--exceptчерез командуPruneCommandвід @hosni в https://github.com/laravel/framework/pull/56140 - [12.x] Підтримка передачі
Htmlableекземплярів доJs::from()від @jj15asmr в https://github.com/laravel/framework/pull/56159 - #56124 Правильне екранування стандартів колонок від @asmecher в https://github.com/laravel/framework/pull/56158
- [12.x] Раннє повернення в методі syncWithoutDetaching для зв’язку belongs-to-many, коли надані пусті значення від @stevebauman в https://github.com/laravel/framework/pull/56157
- [12.x] Додати методи fakeFor і fakeExceptFor до фасаду Queue від @MrPunyapal в https://github.com/laravel/framework/pull/56149
- [11.x] Повернути тестові виправлення від @GrahamCampbell в https://github.com/laravel/framework/pull/56183
- Скасування "[11.x] Передати лімітатор до when & report зворотніх викликів" від @GrahamCampbell в https://github.com/laravel/framework/pull/56184
- Додати метод failWhen до middleware ThrottlesExceptions від @michaeldzjap в https://github.com/laravel/framework/pull/56180
- [12.x] Оновити контракт Castable, щоб приймати масив рядків від @hosmelq в https://github.com/laravel/framework/pull/56177
- Функція: методи doesntStartWith() та doesntEndWith() для рядків від @balboacodes в https://github.com/laravel/framework/pull/56168
- [12.x] Додані функції запам’ятовування контексту від @btaskew в https://github.com/laravel/framework/pull/56156
- [12.x] Виправлення очищення фейку черги для автоматичного відновлення оригінального менеджера черг від @xurshudyan в https://github.com/laravel/framework/pull/56165
- [12.x] Передати лімітатор до when & report зворотніх викликів від @GrahamCampbell в https://github.com/laravel/framework/pull/56187
- [12.x] Додати підтримку Closure до
$key/$valueв методіpluck()колекцій від @ralphjsmit в https://github.com/laravel/framework/pull/56188 - [12.x] Додати
collection()до репозиторію конфігурацій від @KennedyTedesco в https://github.com/laravel/framework/pull/56200 - Додати int до дозволених типів значення в DatabaseRule від @vkarchevskyi в https://github.com/laravel/framework/pull/56199
- [12.x] Виправити очищення фейку подій для автоматичного відновлення оригінального диспетчера подій від @xurshudyan в https://github.com/laravel/framework/pull/56189
- [12.x] Вирівняти стиль PHPDoc у методі Number::parseFloat з іншими методами класу від @AhmedAlaa4611 в https://github.com/laravel/framework/pull/56206
- [12.x] Непослідовне використання @return типу від @AhmedAlaa4611 в https://github.com/laravel/framework/pull/56207
- [12.x] Вирішити проблему з Factory make під час автоматичного завантаження від @jackbayliss в https://github.com/laravel/framework/pull/56211
- [12.x] Рефакторинг ініціалізації драйвера, використовуючи присвоєння з нульовим злиттям у Manager від @Ashot1995 в https://github.com/laravel/framework/pull/56210
- [12.x] Додати URL-підписи макроси у документацію
Requestвід @duncanmcclean в https://github.com/laravel/framework/pull/56230 - [12.x] Оновити PHPDoc для dataForSometimesIteration від @mrvipchien в https://github.com/laravel/framework/pull/56229
- [12.x] Уникнути непотрібного фільтрування, коли не надано жодного колбеку від @AhmedAlaa4611 в https://github.com/laravel/framework/pull/56225
- [12.x] Зробити клас
Fluentітерованим від @xurshudyan в https://github.com/laravel/framework/pull/56218 - Покращити повідомлення про помилки заявок Mailable з очікуваними та фактичними значеннями від @ahinkle в https://github.com/laravel/framework/pull/56221
- [12.x] Додати директиву
@contextBlade від @martinbean в https://github.com/laravel/framework/pull/56146 - [12.x] Виправити: властивості AsCommand не присвоюються командам від @calebdw в https://github.com/laravel/framework/pull/56235
- [12.x] Забезпечити, щоб
withLocaleтаwithCurrencyзавжди відновлювали попередній стан від @xurshudyan в https://github.com/laravel/framework/pull/56234