Enrutamiento CakePHP-[inicio]/slug como URL
routing cakephp-1.3 (2)
Estoy tratando de entender el enrutamiento de Cake, pero no tengo suerte para encontrar una solución a mi problema en particular.
Quiero asignar www.example.com/slug a www.example.com/venues/view/slug, donde slug es el nombre amigable de URL de un registro para un lugar en particular.
También quiero mapear www.example.com/slug/events a www.example.com/events/index/venue:slug.
Después de leer la documentación de CakePHP sobre enrutamiento, algunas veces, no soy más sabio. Entiendo cómo crearía estas rutas para cada lugar individual, pero no estoy seguro de cómo hacer que Cake genere las rutas sobre la marcha.
En primer lugar, no está conectando www.example.com/slug a www.example.com/venues/view/slug, está conectando /slug
a una acción del controlador. Me gusta esto:
Router::connect(''/:slug'',
array(''controller'' => ''venues'', ''action'' => ''view''),
array(''pass'' => array(''slug''));
Para generar el enlace apropiado, harías lo mismo a la inversa:
$this->Html->link(''Foo'',
array(''controller'' => ''venues'', ''action'' => ''view'', ''slug'' => ''bar''))
Eso debería dar como resultado el enlace /bar
.
El problema con el enrutamiento de una /:slug
URL es que es una ruta general. Debe definir cuidadosamente todas las demás rutas que desee usar antes de esta.
Desea tener cuidado al mapear algo en la primera ruta después del nombre de dominio. Esto significa que estaría rompiendo el paradigma controlador / acción / param / param. Puede hacer esto, pero puede significar que necesita definir cada url para su sitio en su archivo de rutas en lugar de usar la magia de enrutamiento de Cake.
Una alternativa puede ser usar / v / para lugares y / e / para eventos para mantener su URL corta, pero divida la URL para el paradigma normal.
Si aún desea hacer lo que solicitó aquí, podría hacer algo como lo siguiente. Limita la babosa a letras, números, guiones y guiones bajos.
Router::connect(
''/:slug'',
array(
''controller'' => ''venues'',
''action'' => ''view''
),
array(
''slug'' => ''[a-zA-Z0-9_-]+''
)
);
Router::connect(
''/:slug/:events'',
array(
''controller'' => ''events'',
''action'' => ''index''
),
array(
''slug'' => ''[a-zA-Z0-9_-]+''
)
);
En su controlador, entonces tendría acceso al slug con lo siguiente (usando la primera ruta como ejemplo).
function view(){
if(isset($this->params[''slug''])){
//Do something with your code here.
}
}