Выход Laravel 11 намечен на первый квартал 2024-го года, что может произойти уже в следующем месяце.
Я начинаю новый проект, и поскольку дата выхода очень близка, решил взглянуть на то что изменится в новом крупном обновлении. Помню как пол года назад прочитал в Laravel News статью о том, что Http Kernel уходит в небытие, и не придал этому особого значения.
Когда я создал проект с помощью команды laravel new project --dev, я был очень удивлён тем, насколько уменьшился размер проекта. Было очень удивительно видеть пустую папку config (можно опубликовать файлы конфигурации при помощи команды php artisan config:publish)!
И, конечно же, там нет Http Kernel. Итак... как же добавить или изменить мидлвари? До Laravel 11 ядро Http Kernel, располагающееся по пути app/Http/Kernel.php,было местом хранения всей конфигурации для мидлварей. Также до Laravel 11 не было необходимости трогать руками файл bootstrap/app.php, если только Вы не использовали фреймворк Lumen. Однако в новой версии его нужно будет трогать.
Честно говоря, для меня, как пользователя Laravel начиная с версии 4.2, это просто смена парадигмы. Вместо легко читаемого файла Kernel.php появилось гораздо больше неявных знаний, необходимых перед добавлением мидлварей.
Новый начальный файл bootstrap/app.php выглядит следующим образом:
return Application::configure() ->withProviders() ->withRouting( web: __DIR__.'/../routes/web.php', // api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', // channels: __DIR__.'/../routes/channels.php', ) ->withMiddleware(function (Middleware $middleware) { // }) ->withExceptions(function (Exceptions $exceptions) { // })->create();
В этом посте я просто исследую мидлвари, но, как Вы видите, это совершенно иной подход нежели тот, который мы видели раньше. Я сидел и ломал голову как мне настроить собственные мидлвари? Как изменить настройки по-умолчанию? Чтобы узнать это, мне пришлось изучить файл Illuminate\Foundation\Configuration\Middleware.
Вызов Application::configure() возвращает экземпляр Illuminate\Foundation\Configuration\ApplicationBuilder, где впоследствии вызываются withProviders(), withRouting(), withMiddleware() и другие функции. Функция withMiddleware() принимает вызываемый объект (callable).
Используя шаблон, мы можем добавить новые алиасы для мидлварей, вызвав alias():
function (Middleware $middleware) { $middleware->alias([ 'some_key' => \App\Http\Middleware\MyMiddleware::class, ]); }
После добавления some_key, мы можем назначить его как отдельным маршрутам, так и их группам. Если мы хотим добавлять мидлвари в каждый запрос, можно использовать функции append() и prepend() для добавления глобальных мидлварей.
function (Middleware $middleware) { // Using a string $middleware->append(\App\Http\Middleware\MyMiddleware::class); // Or adding multiple $middleware->append([ \App\Http\Middleware\MyMiddleware::class, \App\Http\Middleware\MyOtherMiddleware::class, ]); }
Мы можем удалить дефолтные мидлвари, вызвав функцию remove():
function (Middleware $middleware) { // Using a string $middleware->remove(\Illuminate\Http\Middleware\ValidatePostSize::class); // Or removing multiple default middleware $middleware->remove([ \Illuminate\Http\Middleware\TrustProxies::class, \Illuminate\Http\Middleware\HandleCors::class, ]); }
Мы можем добавлять или удалять мидлвари в определённых группах, например, в web, используя функции appendToGroup(), prependToGroup() и removeFromGroup():
function (Middleware $middleware) { $middleware->appendToGroup('web', \App\Http\Middleware\MyMiddleware::class); }
Если/когда файл bootstrap/app.php превратится в помойку (а это несомненно произойдёт), мы можем навести порядок, переместив всё это дело в вызываемый класс.
Я создал класс в app/Http под названием AppMiddleware.php. Поскольку старые привычки умирают медленно, Вы можете назвать его Kernel.php.
<?php namespace App\Http; use Illuminate\Foundation\Configuration\Middleware; class AppMiddleware { public function __invoke(Middleware $middleware) { $middleware->appendToGroup('web', \App\Http\Middleware\MyMiddleware::class); } }
Теперь в файле bootstrap/app.php нужно заменить замыкание на созданный экземпляр класса:
return Application::configure() ->withProviders() ->withRouting( web: __DIR__.'/../routes/web.php', // api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', // channels: __DIR__.'/../routes/channels.php', ) ->withMiddleware(new \App\Http\AppMiddleware()) // here ->withExceptions(function (Exceptions $exceptions) { // })->create();
Как и всё новое, перемены даются тяжело. В связи с этим меня мучает один вопрос. У нас есть всё те же инструменты и возможности, но понять как всем этим управлять, немного сложнее, по крайней мере, на первых порах.
Мне кажется, что это изменение потребует гораздо больше неявных познаний о работе мидлварей. Имеет ли это значение? Скорее всего нет. Но в некоторых случаях Вам может понадобиться удалить или заменить дефолтные значения. Это потребует от Вас знания того, что есть по-умолчанию. Не только в глобальных мидлварях, но и в группах, а также под алиасами. Лично мне кажется, что это изменение увеличивает кривую обучения. Даже я забываю что там есть по-дефолту или какие существуют псевдонимы, и регулярно проверяю файл app/Http/Kernel.php.
Я сомневаюсь стоит ли оно того. А что Вы думаете об этом?
