Умовне завершення чергових задач з обмеженням виключень у Laravel 12.20

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 10 липня, 2025
Ознайомтеся з новими можливостями Laravel v12.20.0, які відкривають ширші горизонти для розробників: від покращення методів для роботи з рядками до впровадження нових функцій у черги. Долучайтеся до читання, щоб дізнатися, як ці оновлення можуть спростити вашу роботу

Команда 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