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