Как сделать маршруты в Laravel нечувствительными к регистру?


У меня есть проект в ларавеле, и в этом проекте много маршрутов.

Но я только что обнаружил, что все маршруты чувствительны к регистру, что означает /рекламодатель/отчеты отличается от /рекламодатель/Отчеты.

Поэтому я хочу, чтобы оба маршрута перенаправлялись на один и тот же вид. В настоящий момент /рекламодатель/Отчеты выдает исключение RouteNotFound.

Я читал о маршруте::pattern() способе сделать это, но так как существует много и для этого мне придется приложить немало усилий. Итак, то, что я хочу, - это лучший способ сделать это, если таковой существует.

Author: jedrzej.kurylo, 2015-08-12

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;
});

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

Имейте в виду, что этот код не был протестирован при запуске. Позволь я знаю, есть ли какие-либо опечатки или что-то работает не так, как ожидалось. Я буду более чем счастлив, если это сработает для вас:)

 8
Author: jedrzej.kurylo, 2015-08-12 17:24:27

Я написал суть, которая делает это: https://gist.github.com/samthomson/f670f9735d200773e543

Отредактируйте свой app/filters.php чтобы проверить наличие прописных символов в маршруте и перенаправить их на преобразованный маршрут.

 0
Author: S.., 2015-08-16 09:18:45