Intereting Posts
Подготовленные заявления Php Включите эмуляцию Сравните массив друзей Facebook с таблицей MySQL Что такое # <some-number> рядом с объектом (someClass) в var_dump объекта? У меня есть вывод. Я прав? Такой же скрипт cURL работает в dev. Не могу понять, почему не в производстве необходимо обновить содержимое страницы изображение captcha в php Как я могу использовать php для заполнения файла manifest.json? Извлечение определенных данных с веб-страницы с использованием PHP Как установить базовый URL для всех страниц моего сайта? Smarty + CodeIgniter – правильный способ использования модели Этот запрос PDO :: FETCH_ASSOC` пропускает первый результат, который возвращается Неустранимая ошибка: вызов неопределенной функции mysqli_connect () в … при подключении PHP 5.4.22 и MySQL 5.5 с Apache 2.4.7 Может ли одна форма иметь несколько действий? Как получить XML-данные как ассоциативный массив с атрибутами в качестве ключа в PHP Исключить ASP.NET из подпапок

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

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

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

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

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

Чтобы сделать маршруты без учета регистра, вам нужно изменить способ сопоставления маршрутов с 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; }); 

Это удалит исходный валидатор и добавит ваш список в список валидаторов.

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

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

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