Les rutes
Que són les rutes?
L’arxiu de rutes és l’encarregat de dirigir el trànsit que arriba al servidor des de l’equip client, la seva funció bàsica és l’execució de la funció corresponent en funció de la ruta indicada per URL. En PHP tradicional l'URL té una traducció directa al sistema de fitxers.

Fig: PHP Tradicional vs Codeigniter
En versions anteriors de codeigniter podíem accedir a URLs que tenien el format:
http://example.com/[controller-class]/[controller-method]/[arguments]
i així accedíem sense especificar cap ruta a un mètode d’un controlador. Des de la versió CodeIgniter 4.2, cal especificar en aquest arxiu la ruta al controlador/funcio que li correspon, en cas que no n'hi hagi cap de definida, CodeIgniter retorna un ERROR de pàgina no trobada (404 Error).
En CodeIgniter podem definir quin és el controlador per defecte i quina serà la funció per defecte, per si un cas no l’especifiquem al definir la ruta.
Les rutes s’especifiquen assignant a l’objecte $routes quin mètode HTTP es fa servir GET, POST, PATCH, PUT, DELETE, OPTIONS o una combinació d’ells, i dins especificarem la porció de l'URL i el controlador::funcio a cridar.
$routes->httpverb('porcio/ruta/url',nomControlador:nomFuncio)on el httpverb pot ser: get, post, patch, put, delete, options
A partir de CodeIgniter 4.3 es dona la possibilitat de cridar una vista des de l’arxiu de rutes sense passar a un controlador
// Route: http://servername/about
// Displays view in /app/Views/pages/about.php
$routes->view('about', 'pages/about');En cas de necessitar passar paràmetres i tractar-los directament en una vista aquests serien accessibles via el array $segments
// File: App/Config/routes.php
// Displays the view in /app/Views/map.php
$routes->view('map/(:segment)/(:segment)', 'map');<?php
// File App/Views/map.php
// Within the view, you can access the segments with
// $segments[0] and $segments[1] respectively.
echo "First param is: " . $segments[0] . "<br/>";
echo "Second param is: " . $segments[1] . "<br/>";Exemple de rutes
// Controller: Products
// Method: list
// HTTP METHOD: get
// URL: http://localhost/products/1/23
// Calls $Products->list(1, 23)
$routes->get('products/1/23', 'Products::list/1/23');
// Controller: Products
// Method: list
// HTTP METHOD: post
// URL: http://localhost/products/1/23
// Calls: $Products->list(1, 23)
$routes->post('products/1/23', 'Products::list/1/23');Podem utilitzar qualsevol dels verbs definits en el protocol HTTP, GET, POST, PUT, DELETE, OPTIONS... en cas de voler obtenir parametres de les URL podrem utilitzar l’element anomenat PLACEHOLDER
Placeholders
Els placeholders ens permet filtrar els parametres de la ruta, si segueixen uns determinats requisits i com es passen al mètode del controller.
// Controller: Catalog
// Method: pLookupByID
// HTTP METHOD: get
// Num. Parameter: 1
// Parameter type: (:num) cal sigui un number
// URL: http://localhost/product/73
// Calls: $Catalog->pLookupByID(73)
$routes->get('product/(:num)','Catalog::pLookupByID/$1');Els placeholder ens permeten revisar si els parametres acompleixen determinats requisits, per exemple si són numeros, si són lletres, etc…
Placeholders | Descripció |
(:any) | aquest placeholder equival qualsevol cadena de caràcters. Aquesta pot incloure també qualsevol nombre de segments, per tant el delimitador / de URL. |
(:segment) | aquest placeholder equival a qualsevol cadena de caràcter excepte el caràcter separador slash (/) restringint el resultat a un únic segment. |
(:num) | aquest placeholder equival a qualsevol nombre sencer. |
(:alpha) | aquest placeholder equival a qualsevol cadena de caràcters o seqüència alfabètica. |
(:alphanum) | aquest placeholder equival a qualsevol cadena de caràcters o seqüència alfabètica o numèrica o una combinació d’ambdós. |
(:hash) | aquest placeholder és el mateix que (:segment), però es pot utilitzar per visualitzar més fàcilment les rutes que tenen un id en format hash. |
https://codeigniter.com/user_guide/incoming/routing.html#placeholders
Placeholders & expressions regulars
Podem especificar també una expressió regular com a placeholder i així d’aquesta forma tenir una validació de paràmetres adaptada a les necessitats del projecte.
// Placeholder variable 1 (expressió regular): [a-z]+
// Placeholder variable 2 (expressió regular): \d+
// http://localhost/products/apple/54
// Calls to Products->show('apple','id_54');
$routes->get('products/([a-z]+)/(\d+)', 'Products::show/$1/id_$2');Quan indiquem a la ruta com es passen els paràmetres, també podem especificar una part fixa si és necessari, com en aquest exemple en el qual el número que es rep com a segon paràmetre es passa a la funció precedit de la paraula id_.
Routes redirect
// Anomenar una ruta
// users/profile li donem el nom de profile
$routes->get('users/profile', 'Users::profile', ['as' => 'profile']);
// Redireccionar cap a una ruta amb nom
// http://localhost/users/about calls to profile => $Users->profile()
$routes->addRedirect('users/about', 'profile');
// Redirecciona cap a una altra URI
// http://localhost/users/about calls to http://localhost/users/profile
$routes->addRedirect('users/about', 'users/profile');Agrupació routes
També podem agrupar les rutes per segments comuns, per exemple totes les futes que comencen per admin les podem agrupar per tenir-les organitzades.
// Agrupem les rutes que tenen com a primer segment admin
// http://localhost/admin/...
$routes->group('admin', static function ($routes) {
// URL: http://localhost/admin/products
$routes->get('products', 'Admin\Products::index');
// URL: http://localhost/admin/category
$routes->get('category', 'Admin\Category::index');
});Restricció rutes segons environment
Podem restringir les rutes a un tipus d’entorn, podem tenir rutes diferents segons estiguem en entorn development o en entorn production, això ens permet afegir mesures de seguretat per les rutes i tenir rutes per desenvolupament o per producció o fins i tot diferents implementacions.
// Rutes aplicables en entorn development
$routes->environment('development', static function ($routes) {
$routes->get('builder', 'Tools\Builder::index');
});Limitació routes a Domini/Subdomini
Així mateix podem restringir les rutes segons el domini/subdomini de la URL
// URL (only): http://sample.example.com/from
$routes->get('from', 'to', ['hostname' => 'sample.example.com']);
// URL only: http://media.DOMAIN.TLD/FROM
// Limitat al subdomini media
$routes->get('from', 'to', ['subdomain' => 'media']);index.php a routes
En CodeIgniter, l’arxiu index.php té una funció molt important: és el punt d’entrada principal a l’aplicació. És el primer fitxer que s’executa quan un usuari accedeix a la web. S'encarrega de:
- Carregar el framework: Inclou i executa el cor de CodeIgniter (bootstrap), carregant les configuracions bàsiques, llibreries i el sistema de rutes.
- Definir constants bàsiques: Defineix rutes importants com la del sistema (system_path), aplicació (application_folder), i altres constants que necessita el framework per funcionar.
- Redirigir les peticions: Totes les URL passen per index.php, que decideix quina part del codi (controlador/mètode) s'ha d'executar segons les rutes definides.
- Evitar accés directe a altres fitxers: Actua com a filtre per evitar que l’usuari accedeixi directament a fitxers del sistema.
Exemple:
Quan accedeixes a:
http://example.com/index.php/usuari/mostrar/1És possible amagar index.php a les URL (per fer-les més amigables) mitjançant mod_rewrite (Apache) a través de l'arxiu htaccess. També podem modificar-ho directament a través de la configuració de CodeIgniter a través de l'arxiu app/config/app.php
/**
* --------------------------------------------------------------------------
* Index File
* --------------------------------------------------------------------------
*
* Typically this will be your index.php file, unless you've renamed it to
* something else. If you are using mod_rewrite to remove the page set this
* variable so that it is blank.
*
* Default: 'index.php'
* @var string
*/
public $indexPage = ''; Aquest paràmetre permet que el CodeIgniter al generar la URL per al tractament d'errors o quan emprem la funció site_url() no incorpori l'arxiu index.php en la ruta. A partir d'aquest moment la ruta seria:
http://example.com/usuari/mostrar/1
