Команда Laravel випустила версію v12.19.0, яка містить нові можливості, зокрема атрибут UseEloquentBuilder
для PHP, каст AsFluent
для моделей, проміжне програмне забезпечення FailOnException
для завдань, можливість перевірки перенаправлення з помилками та інше:
Гристіян Манасієв запропонував атрибут 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
для моделей.
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.
Люк Кузміш додав проміжне програмне забезпечення для черги завдань, що дозволяє завершувати завдання в разі виникнення конкретного виключення. За замовчуванням поведінка — повторне виконання завдання, якщо дозволено ще спроби. Використовуючи це проміжне, ви можете одразу з’ясувати, що завдання не матиме шансів на успіх:
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.
Родріго Педра Брум додав метод fromUploadedFile()
до класу Attachment
для листів, що дозволяє перетворювати екземпляр UploadedFile
на вкладення до листа.
use Illuminate\Mail\Attachment;
Attachment::fromUploadedFile($file);
Деталі можна знайти в Запиті на злиття #56027.
Ви можете ознайомитися з повним переліком нових функцій та оновлень нижче, а також переглянути зміни між версіями 12.18.0 та 12.19.0 на GitHub. Наступні примітки взято безпосередньо з змін:
getDefaultDescription
від @jnoordsij в https://github.com/laravel/framework/pull/55990ComputesOnceableHashInterface
від @Jacobs63 в https://github.com/laravel/framework/pull/56009symfony/console:7.4
від @crynobone в https://github.com/laravel/framework/pull/56015@return
з конструкторів від @michaelnabil230 в https://github.com/laravel/framework/pull/56024FailOnException
для завдань від @cosmastech в https://github.com/laravel/framework/pull/56037