Команда 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
- [11.x] Виправлення валідації для запобігання виключенням несумісної валідації від @crynobone в https://github.com/laravel/framework/pull/55963
- [12.x] Виправлення функції testEncryptAndDecrypt для правильного тестування нових методів від @KIKOmanasijev в https://github.com/laravel/framework/pull/55985
- [12.x] Перевірка, чи існує файл перед намаганням його видалити, від @Jellyfrog в https://github.com/laravel/framework/pull/55994
- Очищення кешів кастів при скасуванні змін від @willtj в https://github.com/laravel/framework/pull/55992
- [12.x] Обробка перевірки на нуль у Str::contains від @Jellyfrog в https://github.com/laravel/framework/pull/55991
- [12.x] Видалення виклику застарілого методу
getDefaultDescriptionвід @jnoordsij в https://github.com/laravel/framework/pull/55990 - Оновлення бібліотеки brace-expansion з 2.0.1 до 2.0.2 у /src/Illuminate/Foundation/resources/exceptions/renderer від @dependabot в https://github.com/laravel/framework/pull/55999
- Покращення обробки помилок у PendingRequest для перетворення TooManyRedirectsE… від @achrafAa в https://github.com/laravel/framework/pull/55998
- [12.x] Виправлення: видалення перетворення моделі з контракту UserProvider від @calebdw в https://github.com/laravel/framework/pull/56013
- [12.x] Видалення єдиного @return маркера в конструкторі від @JordanchoEftimov в https://github.com/laravel/framework/pull/56001
- [12.x] Введення
ComputesOnceableHashInterfaceвід @Jacobs63 в https://github.com/laravel/framework/pull/56009 - [12.x] Додавання assertRedirectBackWithErrors до TestResponse від @AhmedAlaa4611 в https://github.com/laravel/framework/pull/55987
- [12.x] collapseWithKeys - запобігання виключенню в базовому випадку від @DeanWunder в https://github.com/laravel/framework/pull/56002
- [12.x] Стандартизація поведінки size() та підтримка розширених метрик черги від @sylvesterdamgaard в https://github.com/laravel/framework/pull/56010
- [11.x] Виправлення сумісності
symfony/console:7.4від @crynobone в https://github.com/laravel/framework/pull/56015 - [12.x] Поліпшення документації PHPDoc для визначення проміжного програмного забезпечення контролера від @JordanchoEftimov в https://github.com/laravel/framework/pull/56021
- Видалення тегів
@returnз конструкторів від @michaelnabil230 в https://github.com/laravel/framework/pull/56024 - [12.x] Сортування допоміжних функцій в алфавітному порядку від @gigabites19 в https://github.com/laravel/framework/pull/56031
- [12.x] Додавання методу Attachment::fromUploadedFile від @rodrigopedra в https://github.com/laravel/framework/pull/56027
- [12.x]: Додавання атрибуту UseEloquentBuilder для реєстрації кастомного Eloquent Builder від @KIKOmanasijev в https://github.com/laravel/framework/pull/56025
- [12.x] Поліпшення документації PHPDoc для файлів папки Illuminate\Cache від @JordanchoEftimov в https://github.com/laravel/framework/pull/56028
- [12.x] Додавання нового касту моделі з назвою asFluent від @azim-kordpour в https://github.com/laravel/framework/pull/56046
- [12.x] Введення проміжного програмного забезпечення
FailOnExceptionдля завдань від @cosmastech в https://github.com/laravel/framework/pull/56037 - [12.x] Додавання методів isSoftDeletable(), isPrunable() та isMassPrunable() до класу моделі від @shaedrich в https://github.com/laravel/framework/pull/56060