Мидлвар как сервис-провайдер

Мидлвар как сервис-провайдер

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

Например, вы хотите, чтобы дефолтный формат даты на сайта был d/m/Y, а в админ-панели даты должны отображаться в формате Y-m-d. Скорее всего, вы напишите в своем AppServiceProvider:

namespace App\Providers;

use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot(Request $request)
    {
        if ($request->segment(1) === 'admin') {
            Carbon::setToStringFormat('Y-m-d');
        } else {
            Carbon::setToStringFormat('d/m/Y');
        }
    }
}

И всё в порядке — оно работает. Но что-то в этой проверке URL мне не нравится. По сути, мы мы обрабатываем определенные группы маршрутов. Звучит знакомо? У нас для этого есть мидлвары!

Вместо того, чтобы свалить всё в провайдеры — создайте два мидлвара. Где вы будете их хранить и как назовёте — не имеет значения. Для урока я создал App\Http\Middleware\BootstrapAdmin и App\Http\Middleware\BootstrapWeb.

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Carbon;

class BootstrapAdmin
{
    public function handle($request, Closure $next)
    {
        Carbon::setToStringFormat('Y-m-d');
    }
}
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Carbon;

class BootstrapWeb
{
    public function handle($request, Closure $next)
    {
        Carbon::setToStringFormat('d/m/Y');
    }
}

Возможно вы предпочтёте более описательные названия для ваших классов: BootstrapCarbonForAdmin и BootstrapCarbonForWeb. Всё зависит от того, как вы строите структуру вашего приложения.

Теперь мы можем применить эти мидлвары к нашим маршрутам.

use App\Http\Middleware\BootstrapAdmin;
use App\Http\Middleware\BootstrapWeb;

Route::middleware(BootstrapWeb::class)
    ->group(function () {
        //
    });

Route::prefix('admin')
    ->middleware(BootstrapAdmin::class)
    ->group(function () {
        //
    });

Этот паттерн я с удовольствием использую в больших проектах.

Автор: Sebastian De Deyne
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.