Ответ 1
Чтобы сделать маршруты без учета регистра, вам необходимо изменить способ сопоставления маршрутов с URL-адресами. В Laravel все происходит в UriValidator, поэтому вам нужно создать свой собственный валидатор.
К счастью, как и большинство задач в Laravel, это не очень сложно.
Сначала создайте новый класс валидатора - единственное различие между этим и оригиналом заключается в том, что вы добавите модификатор i в конце регулярного выражения для скомпилированного маршрута для включения случая включения -чувствительное соответствие.
<?php namespace Your\Namespace;
use Illuminate\Http\Request;
use Illuminate\Routing\Route;
use Illuminate\Routing\Matching\ValidatorInterface;
class CaseInsensitiveUriValidator implements ValidatorInterface
{
public function matches(Route $route, Request $request)
{
$path = $request->path() == '/' ? '/' : '/'.$request->path();
return preg_match(preg_replace('/$/','i', $route->getCompiled()->getRegex()), rawurldecode($path));
}
}
Во-вторых, вам нужно обновить список совпадений, которые используются для сопоставления URL-адреса маршруту и заменить ваш оригинальный UriValidator.
Чтобы сделать это, добавьте следующее в начало файла routes.php:
<?php
use Illuminate\Routing\Route as IlluminateRoute;
use Your\Namespace\CaseInsensitiveUriValidator;
use Illuminate\Routing\Matching\UriValidator;
$validators = IlluminateRoute::getValidators();
$validators[] = new CaseInsensitiveUriValidator;
IlluminateRoute::$validators = array_filter($validators, function($validator) {
return get_class($validator) != UriValidator::class;
});
Это удалит исходный валидатор и добавит ваш список в список валидаторов.
Имейте в виду, что этот код не был протестирован при запуске. Дайте мне знать, есть ли какие-либо опечатки или что-то не работает должным образом. Я буду более чем счастлив, чтобы это работало для вас:)