{"id":661,"date":"2010-02-10T23:46:45","date_gmt":"2010-02-10T22:46:45","guid":{"rendered":"http:\/\/www.davidrojas.net\/?p=661"},"modified":"2010-02-10T23:46:45","modified_gmt":"2010-02-10T22:46:45","slug":"urls-amigables-en-codeigniter-controlador-catch-all","status":"publish","type":"post","link":"https:\/\/www.davidrojas.net\/index.php\/desarrollo-web\/urls-amigables-en-codeigniter-controlador-catch-all\/","title":{"rendered":"URLs amigables en CodeIgniter: Controlador &#8216;catch-all&#8217;"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.davidrojas.net\/wp-content\/uploads\/2009\/09\/codeigniter_logo.png\" alt=\"\" title=\"codeigniter_logo\" width=\"163\" height=\"104\" class=\"derecha alignright size-full wp-image-360\" \/>Supongamos que estamos programando un CMS en CodeIgniter para integrarlo en nuestros proyectos, y queremos generar urls del estilo <em>www.dominio.com\/titulo-de-la-pagina<\/em>. Una manera de enfocarlo ser\u00eda por ejemplo crear un controlador <em>Paginas<\/em> con un m\u00e9todo <em>cargar<\/em>, al que se le pasar\u00e1 como par\u00e1metro el t\u00edtulo de la p\u00e1gina en cuesti\u00f3n. De esta manera se llamar\u00eda a la url <em>www.dominio.com\/paginas\/cargar\/titulo-de-la-pagina<\/em>. Para eliminar <em>\/paginas\/cargar\/<\/em> de la url editar\u00edamos el fichero <a href=\"http:\/\/www.codeignitor.com\/user_guide\/general\/routing.html\" title=\"Rutas en CodeIgniter\">routing.php<\/a>.<\/p>\n<p>Esto supone un problema: si a\u00f1adimos una regla gen\u00e9rica a las rutas para redirigir cualquier url al controlador <em>paginas\/cargar<\/em>, no funcionar\u00eda el resto de controladores de nuestra aplicaci\u00f3n. Deber\u00edamos a\u00f1adir una regla para cada p\u00e1gina o bien para cada controlador que tengamos, con lo cual perdemos dinamismo y nos obliga a editar el fichero de rutas con cada cambio.<br \/>\n<!--more--><\/p>\n<h3>Extendiendo la librer\u00eda Router<\/h3>\n<p>Lo que nos interesa es un controlador &#8216;catch-all&#8217;, que capture cualquier texto de la url y lo procese siempre que no exista otro controlador con ese nombre. Para ello vamos a extender la librer\u00eda de rutas creando un archivo <em>MY_Router.php<\/em> y guard\u00e1ndolo en <em>application\/libraries\/<\/em>. El m\u00e9todo est\u00e1ndar para extender librer\u00edas es crear un archivo con el mismo nombre a\u00f1adiendo el prefijo <em>MY_<\/em>. Aqu\u00ed ten\u00e9is el c\u00f3digo de <em>MY_Router.php<\/em>:<\/p>\n<pre lang=\"php\">\r\n<?php\r\nclass MY_Router extends CI_Router {\r\n\r\n    function MY_Router()\r\n    {\r\n        parent::CI_Router();\r\n    }\r\n\r\n    function _validate_request($segments)\r\n    {\r\n        \/\/ Comprueba que el controlador no existe\r\n        if (!file_exists(APPPATH.'controllers\/'.$segments[0].EXT))\r\n        {\r\n            $segments = array(\"paginas\", \"cargar\", $segments[0]);\r\n            \r\n        }\r\n        return parent::_validate_request($segments);\r\n    }\r\n}\r\n?>\r\n<\/pre>\n<p>Como veis lo que hacemos es extender el m\u00e9todo <em>_validate_request<\/em> de la librer\u00eda <em>Router<\/em>, que es el que procesa los segmentos de nuestra url. En \u00e9l comprobamos si el nombre del primer segmento de la url corresponde a un controlador existente, si no es as\u00ed a\u00f1adimos al array de segmentos nuestro controlador y m\u00e9todo <em>paginas<\/em> y <em>cargar<\/em> y llamamos al m\u00e9todo <em>_validate_request<\/em> de la librer\u00eda Router original pas\u00e1ndole estos par\u00e1metros.<\/p>\n<p>Finalmente nos queda crear el controlador <em>Paginas.php<\/em>:<\/p>\n<pre lang=\"php\">\r\n<?php\r\nclass Paginas extends Controller {\r\n    function __construct(){\r\n        \tparent::Controller();\r\n    }\r\n    \r\n    function cargar($title){\r\n    \t.....\r\n    }\r\n}\r\n?>\r\n<\/pre>\n<p>Dentro de la funci\u00f3n <em>cargar<\/em>, <code>$title<\/code> contendr\u00e1 el t\u00edtulo de nuestra url, es decir el primer segmento que le pasamos: <em>www.dominio.com\/titulo-de-la-pagina<\/em>. En dicha funci\u00f3n lo gestionaremos como nos interese, siendo lo m\u00e1s l\u00f3gico utilizar ese t\u00edtulo como identificador de nuestra p\u00e1gina y buscarla en la base de datos para mostrarla.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Supongamos que estamos programando un CMS en CodeIgniter para integrarlo en nuestros proyectos, y queremos generar urls del estilo www.dominio.com\/titulo-de-la-pagina. Una manera de enfocarlo ser\u00eda por ejemplo crear un controlador Paginas con un m\u00e9todo cargar, al que se le pasar\u00e1 como par\u00e1metro el t\u00edtulo de la p\u00e1gina en cuesti\u00f3n. De esta manera se llamar\u00eda a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,9,11],"tags":[],"class_list":["post-661","post","type-post","status-publish","format-standard","hentry","category-codeigniter","category-desarrollo-web","category-php"],"_links":{"self":[{"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/posts\/661","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/comments?post=661"}],"version-history":[{"count":40,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/posts\/661\/revisions"}],"predecessor-version":[{"id":701,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/posts\/661\/revisions\/701"}],"wp:attachment":[{"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/media?parent=661"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/categories?post=661"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.davidrojas.net\/index.php\/wp-json\/wp\/v2\/tags?post=661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}