Laravel 12.19 пропонує новий атрибут useEloquentBuilder, middleware для черг FailOnException та багато іншого

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 19 червня, 2025
Останнє оновлення Laravel 12.19.0 принесло ряд захоплюючих новин, таких як новий PHP-атрибут `UseEloquentBuilder`, модельний каст `AsFluent`, посередник для роботи `FailOnException` та багато іншого. Чи готові ви дізнатися, як ці нововведення можуть спростити вашу роботу з фреймворком? Читайте далі, щоб дізнатися всі деталі

Команда Laravel випустила версію v12.19.0, яка містить нові можливості, зокрема атрибут UseEloquentBuilder для PHP, каст AsFluent для моделей, проміжне програмне забезпечення FailOnException для завдань, можливість перевірки перенаправлення з помилками та інше:

# Атрибут PHP Use Eloquent Builder

Гристіян Манасієв запропонував атрибут UseEloquentBuilder, який дозволяє зареєструвати власний запит Eloquent для моделі. Цю функцію неодноразово обговорювали, і вона тепер доступна в Laravel 12 для тих, хто використовує кастомні конструктори запитів.

Раніше для використання кастомного конструктора потрібно було написати щось на кшталт:

class MyModel extends Model
{
    // ...
    public function newEloquentBuilder($query)
    {
        return new CustomBuilder($query);
    }
}

Тепер ви можете скористатися атрибутом, наданим фреймворком:

use Illuminate\Database\Eloquent\Attributes\UseEloquentBuilder;

#[UseEloquentBuilder(CustomBuilder::class)]
class MyModel extends Model
{
    // ...
}

Деталі можна знайти в Запиті на злиття #56025.

# Каст моделі AsFluent

Азім Кардпур додав каст AsFluent для моделей.

namespace App\Models;

use Illuminate\Database\Eloquent\Casts\AsFluent;
use Illuminate\Database\Eloquent\Model;

class Passenger extends Model
{
    protected function casts(): array
    {
        return [
            'address' => AsFluent::class,
        ];
    }
}

Після визначення касту моделі як флюент-екземпляра можна використовувати його з екземпляром моделі:

$passenger = Passenger::first();

// Отримання вкладених значень
$passenger->address->get('office.street');
$passenger->address->get('home.street');

// Оновлення як флюент-екземпляра...
$passenger->address = new Fluent([
    'office' => ['street' => 'нова вулиця'],
    'home' => ['street' => 'нова вулиця']
]);

// Або у вигляді масиву...
$passenger->address = [
    'office' => ['street' => 'нова вулиця'],
    'home' => ['street' => 'нова вулиця']
];

Деталі використання кастів моделей можна знайти в документації Eloquent: Mutators & Casting.

# Проміжне програмне забезпечення Fail on Exception для завдань

Люк Кузміш додав проміжне програмне забезпечення для черги завдань, що дозволяє завершувати завдання в разі виникнення конкретного виключення. За замовчуванням поведінка — повторне виконання завдання, якщо дозволено ще спроби. Використовуючи це проміжне, ви можете одразу з’ясувати, що завдання не матиме шансів на успіх:

use Illuminate\Queue\Middleware\FailOnException;

/**
 * Отримати проміжне програмне забезпечення, через яке має пройти завдання.
 */
public function middleware(): array
{
    return [
        new FailOnException([AuthorizationException::class])
    ];
}

Клас FailOnException може приймати callable, якщо вам потрібна власна логіка, яка приймає виключення та екземпляр завдання:

new FailOnException(fn (\Throwable $e, mixed $job): bool => /* ... */);

Деталі доступні в розділі Завдання, що завершуються через конкретні виключення в документації по чергам.

# Перевірка перенаправлення з помилками

Ахмед Алаа додав два методи для тестування відповідей, які дозволяють перевірити, чи перенаправляє відповідь на попередню сторінку, і чи є помилки в сесії:

$response->assertRedirectBackWithErrors(
    array $keys = [], $format = null, $errorBag = 'default'
);

Другий хелпер навпаки — він перевіряє перенаправлення та підтверджує, що в сесії немає помилок:

$response->assertRedirectBackWithoutErrors();

Ці методи тепер задокументовані в офіційній документації 12.x.

# Додавання вкладення до відправленого листа з екземпляра UploadedFile

Родріго Педра Брум додав метод fromUploadedFile() до класу Attachment для листів, що дозволяє перетворювати екземпляр UploadedFile на вкладення до листа.

use Illuminate\Mail\Attachment;

Attachment::fromUploadedFile($file);

Деталі можна знайти в Запиті на злиття #56027.

# Примітки щодо випуску

Ви можете ознайомитися з повним переліком нових функцій та оновлень нижче, а також переглянути зміни між версіями 12.18.0 та 12.19.0 на GitHub. Наступні примітки взято безпосередньо з змін:

# v12.19.0