Когда вам нужно настроить сервис в 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.