Как сделать маршруты в Laravel нечувствительными к регистру?
У меня есть проект в ларавеле, и в этом проекте много маршрутов.
Но я только что обнаружил, что все маршруты чувствительны к регистру, что означает /рекламодатель/отчеты отличается от /рекламодатель/Отчеты.
Поэтому я хочу, чтобы оба маршрута перенаправлялись на один и тот же вид. В настоящий момент /рекламодатель/Отчеты выдает исключение RouteNotFound.
Я читал о маршруте::pattern() способе сделать это, но так как существует много и для этого мне придется приложить немало усилий. Итак, то, что я хочу, - это лучший способ сделать это, если таковой существует.
2 answers
Чтобы сделать маршруты нечувствительными к регистру, вам нужно будет изменить способ сопоставления маршрутов с 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-адреса с маршрутом, и заменить исходный уривалидатор вашим.
Для этого добавьте следующее в верхней части вашего 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;
});
Это приведет к удалению исходного валидатора и добавлению вашего в список валидаторов.
Имейте в виду, что этот код не был протестирован при запуске. Позволь я знаю, есть ли какие-либо опечатки или что-то работает не так, как ожидалось. Я буду более чем счастлив, если это сработает для вас:)
Я написал суть, которая делает это: https://gist.github.com/samthomson/f670f9735d200773e543
Отредактируйте свой app/filters.php чтобы проверить наличие прописных символов в маршруте и перенаправить их на преобразованный маршрут.