¿Es posible enrutar todas las URL con guiones en FuelPHP?
-
11-12-2019 - |
Pregunta
En la siguiente configuración es posible usar una expresión regular o cualquier otro método además de especificar cada ruta para usar el controlador. thisisatest
cuando la URL es this-is-a-test/action
?¿Tendría que crear/ampliar mi propia clase de enrutador?
<?php
return array(
'_root_' => 'home/index', // The default route
'_404_' => 'error/404', // The main 404 route
//'hello(/:name)?' => array('welcome/hello', 'name' => 'hello')
);
/* end of config/routes.php */
Solución
La forma en que implementé esto fue extender \Fuel\Core\Router
usando lo siguiente.La clase de enrutador funciona con un URI que se ha pasado a través de los métodos en security.uri_filter
de config.php
entonces, en lugar de modificar los métodos de la clase del enrutador, hice que la extensión de mi enrutador agregara una devolución de llamada a esa matriz.
class Router extends \Fuel\Core\Router
{
public static function _init()
{
\Config::set('security.uri_filter', array_merge(
\Config::get('security.uri_filter'),
array('\Router::hyphens_to_underscores')
));
}
public static function hyphens_to_underscores($uri)
{
return str_replace('-', '_', $uri);
}
}
Podrías agregarlo fácilmente directamente a la matriz de configuración en app/config/config.php
mediante un cierre o una llamada a un método de clase o una función.
La desventaja de esto es que tanto /path_to_controller/action como /path-to-controller/action funcionarán y posiblemente causen algunos problemas de SEO de contenido duplicado a menos que se lo indique a la araña de búsqueda.Esto supone que se hace referencia a ambas rutas en algún lugar, es decir.un mapa del sitio o un <a href="">
etc.
Otros consejos
Creo que la clase de enrutador no tiene la funcionalidad de forma predeterminada.De hecho, necesitaría extender o crear su propia clase de enrutador.
Puede usar la configuración de configuración de seguridad.uri_filter para eso.
Cree una función que convierta guiones para guiones bajos, y está terminado.No necesitas extender la clase de enrutador para ello.Simplemente suministre el nombre de la función (en una clase o una función definida en el bootstrap) a la configuración, y está apagado.
Sé que es después del evento, pero esto es para cualquiera que quiera esto en el futuro...
Para evitar confusión entre guiones bajos y subcarpetas, preferí convertir los guiones a mayúsculas y minúsculas, por lo que la URL de enrutamiento this-is-a-test
a clase Controller_ThisIsATest
.
Hice esto (en FuelPHP 1.4) agregando una función anónima al 'uri_filter' en la configuración de 'seguridad' en fuel/app/config/config.php
:
'security' => array(
'uri_filter' => array('htmlentities',
function($uri) {
return str_replace(' ', '', ucwords(str_replace('-', ' ', $uri)));
}),
),