Pull to refresh

Laravel 11. Что нового?

Reading time6 min
Views11K
Original author: Taylor Otwell

Скоро Тейлор и его команда выпустят новую мажорную версию фреймворка. Расскажу, что на данный момент известно о ней.

Laravel 11 продолжает улучшения, начатые в Laravel 10.x, представляя упрощенную структуры приложения, посекундные ограничения скорости, healthcheck-маршруты, изящную ротацию ключа шифрования, улучшения тестирования очередей, почтовый транспорт Resend, интеграцию валидатора Prompt, новые команды Artisan и многое другое. Кроме того, был представлен Laravel Reverb — масштабируемый WebSocket-сервер обеспечивающий надежную работу в режиме реального времени.

PHP 8.2

Laravel 11.x требует, как минимум, версию PHP 8.2.

Упрощенная Структура Приложения

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

Файл Bootstrap

Файл bootstrap/app.php был возрождён как конфигурационный файл, ориентированный на код. Теперь в этом файле вы можете настроить маршрутизацию, мидлвары, сервис-провайдеры, обработку исключений и многое другое. Этот файл объединяет множество высокоуровневых настроек поведения приложения, которые ранее были разбросаны по всему приложению.

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

Сервис-провайдеры

Вместо дефолтной структуры приложения, содержащей пять сервис-провайдеров, Laravel 11 включает в себя только один AppServiceProvider. Функциональность предыдущих включена в bootstrap/app.php и автоматически обрабатывается фреймворком, но может быть помещена и в AppServiceProvider.

Например, обнаружение событий теперь включено по умолчанию, что устраняет необходимость ручной регистрации событий и их слушателей. Однако если вам необходимо зарегистрировать события вручную, вы можете сделать это в AppServiceProvider. Аналогично, привязки модели к маршруту или гейты авторизации, которые вы, возможно, ранее регистрировали в AuthServiceProvider, также могут быть зарегистрированы в AppServiceProvider.

Файлы конфигурации

Расширено использование переменных окружения: а в файл .env.example были добавлены дополнительные параметры. Благодаря этому почти вся основная функциональность фреймворка теперь может быть настроена через .env-файл вашего приложения, а не через отдельные файлы конфигурации. Соответственно, каталог config по умолчанию теперь пустой.

При необходимости файлы конфигурации могут быть опубликованы с помощью новой Artisan-команды config:publish, которая позволяет публиковать только те файлы конфигурации, которые вы хотите настроить:

php artisan config:publish

Но, разумеется, вы можете опубликовать все конфигурационные файлы фреймворка:

php artisan config:publish --all

Опциональная маршрутизация API и Broadcast

По умолчанию теперь отсутствуют файлы маршрутов api.php и channels.php, так как большинству приложений они не нужны. Но их их можно создать с помощью Artisan-команд :

php artisan install:api
php artisan install:broadcasting

Мидлвары

Ранее Laravel устанавливал девять мидлваров для различных задач: аутентификация, тримминг входящих строк, проверка CSRF-токенов.

В Laravel 11 эти мидлвары были перенесены в сам фреймворк, чтобы не увеличивать объем вашего приложения. Во фреймворк были добавлены новые методы настройки поведения этих мидлваров, которые можно вызывать из файла bootstrap/app.php:

->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(
        except: ['stripe/*']
    );

    $middleware->web(append: [
        EnsureUserIsSubscribed::class,
    ])
})

Поскольку все мидлвары может настроить через bootstrap/app.php, то необходимость в отдельном HTTP «kernel» классе отпала.

Планировщик

С помощью нового фасада Schedule запланированные задачи теперь могут быть заданы непосредственно в файле routes/console.php, что устраняет необходимость в отдельном «kernel» классе консоли:

use Illuminate\Support\Facades\Schedule;

Schedule::command('emails:send')->daily();

Обработка исключений

Как и маршрутизация и мидлвары, обработка исключений теперь может быть настроена прямо в файле bootstrap/app.php вместо отдельного класса обработчика исключений, что позволяет сократить общее количество файлов, включаемых в новое Laravel-приложение:

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->dontReport(MissedFlightException::class);

    $exceptions->reportable(function (InvalidOrderException $e) {
        // ...
    });
})

Настройки приложения по умолчанию

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

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

Laravel Reverb

Laravel Reverb обеспечивает невероятно быструю масштабируемую связь через WebSocket в реальном времени для вашего Laravel-приложения. Плюс плавную интеграцию с существующим набором Laravel-инструментов для трансляции событий, таких как Laravel Echo.

php artisan reverb:start

Кроме того, Reverb поддерживает горизонтальное масштабирование с помощью возможностей публикаций/подписок Redis, позволяя распределять WebSocket-трафик между несколькими внутренними Reverb-серверами, поддерживающими одно высоконагруженное приложение.

Посекундное ограничения скорости

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

RateLimiter::for('invoices', function (Request $request) {
    return Limit::perSecond(1);
});

Healthcheck-маршруты

Laravel 11 включает в себя директиву healthcheck-маршрута, которая задает в приложении эндпоинт проверки состояния приложения. Точка может быть вызвана сторонними сервисами мониторинга приложений или системами оркестровки, такими как Kubernetes. По умолчанию этот маршрут обслуживается по адресу /up:

->withRouting(
    web: __DIR__.'/../routes/web.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/up',
)

При HTTP-запросах к этому маршруту Laravel также будет отправлять событие DiagnosingHealth, что позволит вам выполнить дополнительные проверки работоспособности, актуальные для вашего приложения.

Изящная ротация ключа шифрования

Поскольку Laravel шифрует все файлы cookie, включая сессии вашего приложения, то, практически каждый запрос зависит от шифрования. Однако, из-за этого, смена ключа шифрования в приложении приведет к выходу всех пользователей из вашего приложения. Кроме того, расшифровка данных, зашифрованных предыдущим ключом шифрования, становится невозможной.

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

При шифровании значений Laravel всегда будет использовать «текущий» ключ шифрования, который находится в переменной среды APP_KEY. При расшифровке значений Laravel сначала попытается использовать текущий ключ. Если расшифровка с использованием текущего ключа не удалась, то Laravel попытается использовать все предыдущие ключи, пока один из ключей не сможет расшифровать значение.

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

Валидация Prompt

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

Laravel Prompts поддерживает валидацию через замыкания:

$name = text(
    label: 'What is your name?',
    validate: fn (string $value) => match (true) {
        strlen($value) < 3 => 'The name must be at least 3 characters.',
        strlen($value) > 255 => 'The name must not exceed 255 characters.',
        default => null
    }
);

Однако такой способ может стать громоздким при работе с большим количеством вводимых данных или сложными сценариями валидации. Поэтому в Laravel 11 вы можете использовать всю мощь валидатора Laravel:

$name = text('What is your name?', validate: [
    'name' => 'required|min:3|max:255',
]);

Тестирование взаимодействия с очередью

Раньше попытка протестировать, было ли задание в очереди запущено, удалено или завершилось сбоем, являлось обременительным и требовало определения кастомных фейков и заглушек очередей. Однако в Laravel 11 вы можете легко протестировать эти взаимодействия, используя метод withFakeQueueInteractions:

use App\Jobs\ProcessPodcast;

$job = (new ProcessPodcast)->withFakeQueueInteractions();

$job->handle();

$job->assertReleased(delay: 30);

Новые Artisan-команды

Были добавлены новые команды, позволяющие быстро создавать классы, интерфейсы и трейты:

php artisan make:class
php artisan make:interface
php artisan make:trait

Laravel World — вся самая свежатина о PHP и Laravel в Телеграме.

Tags:
Hubs:
Total votes 17: ↑16 and ↓1+18
Comments4

Articles