domingo, 25 de enero de 2009

URL mejoradas con rutas personalizadas

La idea es la siguiente. A veces la estructura /controller/action/arguments de algunas URL de Cake son poco significativas para los usuarios. Es un detalle que a veces me resulta un poco molesto y en particular para un proyecto que tengo entre manos. Por ejemplo. Supongamos que tengo un CMS y quiero mostrar los comentarios a un post. Una posible URL sería:

/posts/show_comments/slug_del_post

Una URL mucho mejor sería

/posts/slug_del_post/show_comments

Esto se puede conseguir definiendo una ruta de la siguiente manera:

Router::connect('/posts/:slug/:action/*', array('controller' => 'posts'), array('pass' => array('slug')));

Ahora, la segunda URL nos dispara la acción show_comments del Posts controller y como extra, le pasa el argumento slug, de modo que la puedes definir así:

function show_comments ($slug) {...}

Todo esto sacado del manual

2 comentarios:

floydbrush dijo...

Y esto, tal cual está definido, ¿no puede provocar problemas en otras acciones de posts?

Quizás una acción function show_view ($id) funcionaría igual, simplemente teniendo en cuenta el nuevo formato de las URLS /posts/id/view

Pero una posible acción function xxx () sin parámetros, tengo mis dudas. ¿Lo has probado?

Saludos

Frankie dijo...

No lo he probado exhaustivamente, pero una acción /blogs/index (para obtener una lista de blogs, por ejemplo) funciona correctamente.

$html->link() también genera los enlaces correctos siempre que en el array de la url añadamos la clave 'slug' (el parámetro, vamos).

Ahora mismo no tengo el proyecto delante y no recuerdo si lo he comprobado suficientemente, pero creo que las acciones con prefijo admin /admin/blogs/index funcionarían correctamente.