Новые возможности Laravel 11

Источник: «What’s New in Laravel 11: Upcoming Changes»
Привет, веб-разработчики! Недавно появились новости о Laravel 11, и о новых возможностях, с которыми определённо стоит пообщаться. Если вы увлекаетесь Laravel так же, как и я, наверняка не терпится узнать, что нового появилось и как это облегчит жизнь. Так что давайте погрузимся в тему. И да, сделаем это в непринуждённой манере с большим количеством примеров кода, чтобы было понятно и весело.

Оглавление

Улучшение маршрутизации

Первая вещь, которая бросается в глаза в Laravel 11, — улучшение маршрутизации. Команда поработала над тем, чтобы сделать процесс маршрутизации производительным и интуитивно понятным. Например, теперь можно лаконичнее определять группы маршрутов.

Route::prefix('admin')->group(function () {
Route::get('/dashboard', function () {
// Dashboard view
});
Route::get('/profile', function () {
// Profile view
});
});

Это выглядит знакомо, но под капотом Laravel 11 оптимизирует эти маршруты, делая приложение быстрее. Это как дать маршрутам порцию кофеина!

Усовершенствованный Eloquent ORM

Eloquent ORM, сердце взаимодействия Laravel с базами данных, тоже получил любви. Появилась новая функция под названием "Eloquent Casts", плавно преобразующая атрибуты в общие типы данных или даже в пользовательские классы. Это удобно для работы с преобразованиями данных непосредственно в модели.

protected $casts = [
'is_active' => 'boolean',
'launch_date' => 'datetime',
'options' => 'array',
'custom_object' => CustomClass::class,
];

Это означает, что в контроллерах или службах для манипулирования данными будет меньше шаблонов. Определите casts один раз, а Eloquent сделает остальное.

Пользовательские касты в Laravel 11

Laravel 11 даёт тонко контролировать каст данных, позволяя использовать пользовательские классы для кастов. Это означает, что можно задать, как происходит каст атрибутов, когда они устанавливаются или извлекаются из модели.

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

class AddressCast implements CastsAttributes
{
public function get($model, string $key, $value, array $attributes)
{
return new Address(...json_decode($value, true));
}

public function set($model, string $key, $value, array $attributes)
{
return json_encode([
'line1' => $value->line1,
'city' => $value->city,
'country' => $value->country,
]);
}
}

А затем вы можете использовать этот каст в модели, например, так:

class User extends Model
{
protected $casts = [
'address' => AddressCast::class,
];
}

При такой настройке при каждом обращении к атрибуту адреса в модели User он будет автоматически инстанцироваться в объект Address, а при задании его значения он будет преобразован обратно в JSON-представление для хранения в базе данных.

Давайте рассмотрим практический пример, в котором используется пользовательский каст для обработки сложного поля настроек в модели пользователя. Мы хотим, чтобы это поле настроек было легко доступно как объект PHP, когда мы работаем с ним в приложении, но хранилось в базе данных в виде JSON.

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

class SettingsCast implements CastsAttributes
{
public function get($model, string $key, $value, array $attributes)
{
return new Settings(json_decode($value, true));
}

public function set($model, string $key, $value, array $attributes)
{
return $value->toArray();
}
}

class User extends Model
{
protected $casts = [
'settings' => SettingsCast::class,
];
}

В этом примере Settings — пользовательский класс, заданный для работы с настройками пользователя. Класс SettingsCast гарантирует, что при обращении к атрибуту settings в модели User, он возвращается в виде объекта Settings. А когда мы его задаём, он автоматически сериализуется в соответствующий формат JSON для хранения.

Движок базы данных Laravel Scout

Laravel Scout, решение для полнотекстового поиска на основе драйверов для Eloquent, теперь включает в себя движок базы данных из коробки. Это идеально подходит для тех, кому не нужен тяжёлый поисковый движок вроде Algolia или Elasticsearch для небольших проектов.

$articles = Article::search('Laravel 11')->get();

Scout использует вашу базу данных по умолчанию для полнотекстового поиска, что упрощает настройку и использование, для прототипов или небольших приложений.

Улучшенные ответы авторизации

В Laravel 11 появился интуитивно понятный способ обработки ответов авторизации. Теперь, когда политика или гейт отказывают в доступе, можно напрямую предоставить пользовательское сообщение об ошибке.

Gate::define('update-post', function ($user, $post) {
return $user->id === $post->user_id
? Response::allow()
: Response::deny('You do not own this post.');
});

Это изменение даёт пользователям наглядную обратную связь, когда не разрешается выполнять недоступные действия, что улучшает пользовательский опыт.

Представления пагинации Tailwind CSS

Для тех, кто занимается фронтендом, Laravel 11 поставляется с пагинацией Tailwind CSS из коробки. Пользователи Tailwind оценят это дополнение. Больше не придётся возиться с пользовательскими стилями пагинации, если этого не хотите!

{{ $users->links() }}

И так же вы получаете красивую, стилизованную под Tailwind пагинацию. Эти небольшие улучшения качества жизни делают Laravel 11 таким приятным в работе.

Улучшения очереди

Система очередей Laravel — это инструмент для откладывания трудоёмких задач, таких как отправка электронной почты или обработка изображений. В Laravel 11 система очередей усовершенствована за счёт улучшенной обработки отказов и упрощённого синтаксиса для определения сложных рабочих процессов.

Представьте, что у вас есть задание, которое должно повторить попытку при неудаче, но с указанной задержкой и количеством попыток. Laravel 11 делает это элементарным:

public function handle()
{
// Логика задания
}

public function failed(Throwable $exception)
{
// Вызывается, когда задание провалено после заданного количества попыток
}

public $tries = 3;
public $backoff = 60; // Delay in seconds

Такая настройка обеспечивает больший контроль над повторными попытками выполнения заданий и обработкой сбоев, делая приложение более устойчивым.

Улучшения совместимости с Octane

Laravel Octane повышает производительность вашего приложения, обслуживая его с помощью мощных серверов, таких как Swoole и RoadRunner. Laravel 11 привносит улучшения совместимости и оптимизации для Octane, гарантируя, что приложения Laravel будут работать ещё быстрее, при высокой нагрузке.

Совместимость фреймворка с Octane означает, что теперь можно использовать одновременные запросы и долгоживущие экземпляры приложений, не беспокоясь о таких распространённых проблемах, как утечки памяти или загрязнение экземпляров.

Новые возможности тестирования

Тестирование — часть процесса разработки, и в Laravel 11 появились новые возможности тестирования, гарантирующие, что приложение работает так, как ожидается. Улучшенные утверждения HTTP-клиента выполняют выразительные и комплексные тесты для внешних HTTP-запросов.

$response = $this->get('/api/user');

$response->assertJson(fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'John Doe')
->etc()
);

Этот гибкий синтаксис для утверждений относительно JSON-структур делает тестирование API интуитивнее и менее подверженным ошибкам.

Улучшенная поддержка Inertia.js

В Laravel 11 улучшена поддержка современного JavaScript, а также Inertia.js, фреймворка для создания одностраничных приложений, лишённых проблем, присущих традиционным SPA. В частности, улучшена интеграция для передачи данных из Laravel в компоненты Inertia.js и улучшено управление сессиями для аутентификации в SPA.

Теги компонентов Blade

Blade, шаблонизатор Laravel, теперь поддерживает интуитивный способ работы с компонентами. Можете использовать упрощённый синтаксис тегов для включения компонентов, что делает файлы Blade чище и читабельнее.

<x-alert type="error" :message="$message" />

Новый синтаксис тегов компонентов не только улучшает читаемость, но и упрощает процесс передачи данных компонентам.

Laravel 11: Метод once

Это фантастическое дополнение для тех случаев, когда нужно, чтобы часть кода в приложении выполнялась только один раз за запрос, независимо от того, сколько раз её вызывали. Это может быть полезно для оптимизации производительности и избежания лишних операций.

Допустим, в приложении используется загрузчик конфигурации, и этот загрузчик вызывается в разных частях приложения. При каждом вызове загрузчик выполняется заново, что приводит к ненужным затратам производительности. С помощью метода once в Laravel 11 этот процесс упрощается. Вот простой пример, иллюстрирующий, как использовать once:

$value = once(function () {
// Представьте, что это дорогостоящая операция, например загрузка конфигурации из файла или базы данных.
return config('app.name');
});

// Сколько бы раз вы ни вызывали `once` с одним и тем же замыканием,
// оно выполнится только в первый раз и вернёт кэшированный результат.

В этом сценарии анонимная функция, переданная в once, будет выполнена при первом вызове once. Если в течение жизненного цикла запроса будут сделаны последующие вызовы функции once с тем же замыканием, once вернёт результат первого выполнения без повторного запуска замыкания.

Метод once — это инструмент для оптимизации приложения. Способствующий созданию более чистого и эффективного кода, гарантируя, что дорогостоящие операции не будут повторяться без необходимости. Кроме того, его невероятно легко использовать и интегрировать в проекты Laravel.

Практические примеры использования

Новый трейт Dumpable в Laravel 11

Трейт Dumpable легко выгружающий и завершающий приложение (dd) или выгружающий (dump) свойства модели Eloquent или класса, использующего этот трейт, непосредственно из самого объекта. Это полезно, для просмотра структуры данных моделей или любых других объектов во время разработки, без использования внешних средств отладки или методов подробного логирования.

Чтобы использовать трейт Dumpable в моделях Eloquent или другом классе, сначала импортируйте трейт из пространства имён, а затем используйте в определении класса, как показано ниже:

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Traits\Dumpable;

class YourModel extends Model
{
use Dumpable;

// Свойства и методы вашей модели
}

Если модель использует трейт Dumpable, можно легко выгрузить свойства модели, используя:

$yourModelInstance = YourModel::find(1);
$yourModelInstance->dump();

Или, если хотите остановить выполнение скрипта после дампа свойств модели, используйте:

$yourModelInstance->dd();

Что учесть перед переходом на Laravel 11

Подведение итогов

Laravel 11 продолжает совершенствовать фреймворк, делая процесс разработки более плавным и приятным. Будь то улучшения в бэкенде, такие, как маршрутизация и улучшения Eloquent, или преимущества во фронтенде, такие, как пагинация Tailwind, в этом выпуске найдутся нововведения для каждого энтузиаста Laravel.

Дополнительные материалы

Предыдущая Статья

Что такое htmx

Следующая Статья

PHP 8.4: что нового и дата выхода