Table of Contents : Il manuale

Configurazione del sistema di Routing

Il Routing é una caratteristica che permette di mappare gli URL in azioni dei controller. é inserita in CakePHP per rendere piú gradevoli, configurabili e flessibili gli URL. Non é necessario usare la funzione mod_rewrite di Apache, anche se sarebbe consigliato per rendere ancora piú gradevole la barra dell'indirizzo.

In CakePHP 1.2 il routing é stato potenziato e ora offre molte caratteristiche aggiuntive.

Prima di iniziare a configurare il routing, devi sapere che CakePHP ha delle impostazioni di default, che funzionano piuttosto bene nella maggior parte delle applicazioni. Puoi accedere a una azione direttamente dall'URL semplicemente scrivendo il suo nome. Puoi anche passarle dei parametri, sempre tramite l'URL.

    Ecco come é composto il meccanismo di routing di default:
    http://example.com/controller/action/param1/param2/param3
  1. Ecco come é composto il meccanismo di routing di default:
  2. http://example.com/controller/action/param1/param2/param3

L'URL /posts/view richiama l'azione view() del controller PostsController, e /products/viewClearance richiama l'azione view_clearance() del controller ProductsController. Se l'URL non specifica una azione, viene richiamata automaticamente l'azione index().

Il setup di default permette anche di passare dei parametri alle tue azioni tramite l'URL. Per esempio, la richiesta di /posts/view/25 equivale al chiamare l'azione view(25) del PostsController.

Novitá: in CakePHP 1.2 si puó anche nominare i parametri. Puoi dare un nome ai parametri e inviare i rispettivi valori tramite URL. Per esempio la richiesta di /posts/view/title:first+post/category:general diviene una chiamata all'azione view() del PostsController. In questa azione puoi accedere ai valori dei parametri title e category tramite la notazione $this->passedArgs['title'] e $this->passedArgs['category'].

Ecco alcuni esempi per spiegare meglio.

URL alla azione del controller, mappata nel modo di default:
    
URL: /monkeys/jump
Richiama: MonkeysController->jump();
 
URL: /products
Richiama: ProductsController->index();
 
URL: /tasks/view/45
Richiama: TasksController->view(45);
 
URL: /donations/view/recent/2001
Richiama: DonationsController->view('recent', '2001');

URL: /contents/view/chapter:models/section:associations
Richiama: ContentsController->view();
$this->passedArgs['chapter'] = 'models';
$this->passedArgs['section'] = 'associations';

Definire le proprie regole di routing permette di controllare come l'applicazione risponderá a determinati URL. Le regole di routing si definiscono nel file /app/config/routes.php utilizzando il metodo Router::connect().

Il metodo connect() richiede tre parametri: l'URL che vuoi mappare, i valori di default per gli elementi personalizzati, e l'espressione regolare che permette di aiutare il router a comprendere quali URL sono validi.

Il formato di base per definire una regola di routing é:

Router::connect(
    'URL',
    array('nomeParametro' => 'valorePredefinito'),
    array('nomeParametro' => 'espressioneRegolare')
)
  1. Router::connect(
  2. 'URL',
  3. array('nomeParametro' => 'valorePredefinito'),
  4. array('nomeParametro' => 'espressioneRegolare')
  5. )

Il primo parametro &greave; utilizzato per dire al router che tipo di URL deve controllare. L'URL é una normale stringa delimitata da slash, ma puó contenere anche un carattere qualsiasi (*) un un elemento personalizzato (gli elementi sono contraddistinti dall'uso dei due punti nell'URL). Quando usi un nome indichi al router a che tipo di URL fa riferimento, e specificando degli elementi puoi settare dei parametri dell'azione del controller.

Una volta specificato l'URL, si utilizzano gli ultimi due parametri del metodo connect() per indicare a CakePHP cosa fare quando la richiesta soddisfa la regola impostata. Il secondo parametro é un array associativo. Le chiavi dell'array possono essere richiamate dopo il primo elemento dell'URL, oppure puoi usare gli elementi di default: :controller, :action e :plugin. I valori delle chiavi sono i valori che imposti di default. Ecco qualche esempio su come si usa il secondo parametro del metodo connect().

Router::connect(
    '/pages/*',
    array('controller' => 'pages', 'action' => 'display')
);
  1. Router::connect(
  2. '/pages/*',
  3. array('controller' => 'pages', 'action' => 'display')
  4. );

Questa regola si trova alla linea 40 del file routes.php. Indica che tutti gli URL che iniziano con /pages/ richiamano la funzione display() del controller PagesController(); per esempio, la richiesta /pages/products richiama PagesController->display('products').

Router::connect(
    '/government',
    array('controller' => 'products', 'action' => 'display', 5)
);
  1. Router::connect(
  2. '/government',
  3. array('controller' => 'products', 'action' => 'display', 5)
  4. );

In questo secondo esempio si vede come puoi usare il secondo parametro di connect() per definire dei valori di default. Se stai costruendo una sito che reggruppa i prodotti in diverse categorie di clienti, puoi considerare di creare una regola di routing. Questo ti permette di usare /government al posto di /products/display/5.

Per aggiungere flessibilitá puoi specificare degli elementi personalizzati. In questo modo puoi definire in che posizione dell'URL devono trovarsi determinati parametri. Quando viene effettuata una richiesta, i valori di ciascun elemento sono disponibili in $this->params all'interno del controller. Questo é un modo diverso da come sono trattati i parametri con un nome spiegati prima, infatti nota la differenza: i parametri con un nome (/controller/action/name:value) si rirovano in $this->passedArgs, mentre i valori degli elementi personalizzati delle regole di routing si trovano in $this->params. Quando definisci un elemento di routing personalizzato, puoi anche identificarlo con una espressione regolare, che indichi a CakePHP come riconoscere se l'URL é valido o no.

Router::connect(
    '/:controller/:id',
    array('action' => 'view'),
    array('id' => '[0-9]+')
);
  1. Router::connect(
  2. '/:controller/:id',
  3. array('action' => 'view'),
  4. array('id' => '[0-9]+')
  5. );

Questo semplice esempio illustra come creare un modo rapido per visualizzare i modelli da tutti i controller, tramite un elegante URL come /controllername/id. L'URL descritto con connect() specifica due elementi: :controller e :id. L'elemento :controller é un elemento di default di CakePHP, quindi il router sa come funziona e quindi é in grado di identificare il nome del controller nell'URL. L'elemento :id é un elemento personalizzato, e deve essere definito tramite l'espressione regolare che si trova nel terzo parametro. In questo modo si indica a CakePHP come riconoscere l'ID nell'URL, piuttosto che qualcos'altro, come per esempio il nome di un'azione.

Quando hai definito questa regola, richiedendo /apples/5 ottieni lo stesso che richiedendo /apples/view/5. Ambedue le richieste richiamano il metodo view() del controller ApplesController. All'interno del metodo view(), puoi accedere al valore di ID tramite $this->params['id'].

Un altro esempio, da vero professionista.

Router::connect(
    '/:controller/:year/:month/:day',
    array('action' => 'index', 'day' => null),
    array(
        'year' => '[12][0-9]{3}',
        'month' => '(0[1-9]|1[012])',
        'day' => '(0[1-9]|[12][0-9]|3[01])'
    )
);
  1. Router::connect(
  2. '/:controller/:year/:month/:day',
  3. array('action' => 'index', 'day' => null),
  4. array(
  5. 'year' => '[12][0-9]{3}',
  6. 'month' => '(0[1-9]|1[012])',
  7. 'day' => '(0[1-9]|[12][0-9]|3[01])'
  8. )
  9. );

Stavolta é piuttosto complesso, ma questo indica quanto potente puó essere il sistema di routing. L'URL in questione ha quattro elementi. Il primo é ormai noto: é l'elemento standard che indica a CakePHP il nome del controller.

Poi specifichiamo alcuni valori. Indipendentemente dal controller, vogliamo richiamare l'azione index(). Impostiamo il parametro day (il quarto elemento nell'URL) a null per indicare che é opzionale.

Infine specifichiamo l'espressione regolare che identifica l'anno, i mesi e i giorni in formato numerico.

Alla fine questa regola valida richieste come /articles/2007/02/01, /posts/2004/11/16, e /products/2001/05 (il parametro day é opzionale, ricordi?), richiamando l'azione index() nei rispettivi controllers, con i parametri personalizzati della data, disponibili in $this->params.