route resource php regex laravel laravel-5 laravel-routing

php - resource - ¿Cómo hacer que las rutas en Laravel sean insensibles?



route view laravel (2)

Para que las rutas no distingan entre mayúsculas y minúsculas, deberá modificar la forma en que las rutas coinciden con las URL. En Laravel, todo sucede en el objeto UriValidator, por lo que tendrás que crear tu propio validador.

Afortunadamente, como la mayoría de las tareas en Laravel , no es realmente complicado.

En primer lugar, cree la nueva clase de validador; la única diferencia entre este y el original es que agregará el modificador i al final de la expresión regular para la ruta compilada para cambiar la habilitación de mayúsculas y minúsculas.

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

En segundo lugar, debe actualizar la lista de emparejamientos que se utilizan para hacer coincidir la URL con una ruta y reemplazar el UriValidator original con el suyo.

Para hacerlo, agregue lo siguiente en la parte superior de su archivo 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; });

Esto eliminará el validador original y agregará el suyo a la lista de validadores.

Tenga en cuenta que este código no se ha probado ejecutando. Avíseme si hay errores tipográficos o si algo no funciona como se esperaba. Estaré más que feliz de conseguir que funcione para usted :)

Tengo un proyecto en laravel y hay muchas rutas en ese proyecto.

Pero acabo de descubrir que las rutas son sensibles a las mayúsculas y minúsculas, los medios / anunciantes / informes son diferentes de / publicitario / Informes .

Entonces, lo que quiero es que ambas rutas redirijan a la misma vista. Actualmente / publicista / Informes proporciona la excepción de RouteNotFound.

He leído sobre la forma de hacerlo de Route :: pattern () pero como hay muchas rutas tendré que esforzarme mucho para eso. Entonces, lo que quiero es una mejor forma de hacerlo, si es que hay alguno.