Table of Contents : Il manuale

Configurazione

 

Configurazione del Database

CakePHP cerca i dati di configurazione del database nel file app/config/database.php. Puoi trovare un esempio di configurazione nel file app/config/database.php.default. Una configurazione corretta assomiglia a questa:

var $default = array('driver'      => 'mysql',
                     'persistent'  => false,
                     'host'        => 'localhost',
                     'login'       => 'cakephpuser',
                     'password'    => 'c4k3roxx!',
                     'database'    => 'my_cakephp_project',
                     'prefix'      => '');
  1. var $default = array('driver' => 'mysql',
  2. 'persistent' => false,
  3. 'host' => 'localhost',
  4. 'login' => 'cakephpuser',
  5. 'password' => 'c4k3roxx!',
  6. 'database' => 'my_cakephp_project',
  7. 'prefix' => '');

L'array chiamato $default viene utilizzato per tutti i modelli, ma puoi impostare un database diverso in ogni modello tramite la variabile $useDbConfig. Per esempio, se la mia applicazione utilizza un secondo database, oltre a quello predefinito, puoi usarlo nei tuoi modelli: basta creare un array simile a quello chiamato $default, e poi impostare la variabile $useDbConfig = ‘array_del_secondo_database’ nei modelli che ne fanno uso.

Modifica le coppie di chiavi/valori come preferisci nell'array di configurazione.

Chiave Valore
driver Il nome del driver del database relativo a questa connessione. Per esempio: mysql, postgres, sqlite, pear-nomedriver, adodb-nomedriver, mssql, oracle, o odbc.
persistent Scegli se utilizzare o meno una connessione persistente.
host Hostname del database server (o indirizzo IP).
login Username per accedere al database.
password Password di accesso.
database Nome del database a cui ci si connette.
prefix (facoltativo) Una stringa da usare come prefisso di ogni tabella nel database. Se le tue tabelle non hanno un prefisso, lascia una stringa vuota.
port (facoltativo) La porta TCP o il socket Unix usato per la connessione.
encoding Il set di caratteri da utilizzare per le interrogazioni SQL.
schema Usato in PostgreSQL per specificare il nome dello schema da usare.

Nota che il prefisso è per le tabelle, e non per i modelli. Ad esempio, se crei una tabella di collegamento tra i modelli Apple e Flavor, devi chiamarla prefisso_apples_flavors (e non prefisso_apples_prefisso_flavors), e ovviamente impostare la chiave prefix a 'prefisso_'.

A questo punto, puoi esaminare le convenzioni di CakePHP, descritte nell'appendice a questo manuale. Se utilizzi le convenzioni standard nei nomi delle tabelle (e delle colonne) puoi usare alcune funzioni predefinite e ti risparmi un po' di configurazione.

Configurazione dell'applicazione

La configurazione generale dell'applicazione si trova in app/config/core.php. Questo file è una lista di variabili e costanti della classe Configure che determinano il comportamento della tua applicazione. Prima di addentrarci nella configurazione vera e propria, diamo un'occhiata a Configure, la classe del registro di configurazione di CakePHP.

La classe Configuration

Anche se in CakePHP non accederai spesso alla configurazione, talvolta può essere utile avere una configurazione specifica per la propria applicazione. In passato puoi aver definito alcuni valori di configurazione tramite delle variabili o costanti salvate in qualche file. Ora puoi includere i tuoi files di configurazione per avere a disposizione quei valori.

La nuova classe Configure di CakePHP può essere usata per salvare e utilizzare delle impostazioni relative all'applicazione. Ma attento: questa classe ti permette di salvare qualsiasi cosa, per poterla riutilizzare ovunque nel tuo codice. Questa caratteristica potrebbe indurti a non rispettare le regole MVC che stanno alla base di CakePHP. La funzione principale della classe Configure, infatti, è di raccogliere quelle variabili che vengono condivise tra diversi oggetti. Ricorda dunque la regola "convention over configuration" e non tradire la struttura MVC di CakePHP.

Puoi richiamare staticamente i metodi di questa classe da qualsiasi parte della tua applicazione.

<?php Configure::read('debug'); ?>
  1. <?php Configure::read('debug'); ?>

Metodi della classe Configure

write(string $key, mixed $value)

Si usa il metodo write() per salvare i dati nella classe Configure

<?php
 
Configure::write('Company.name','Pizza, Inc.');
Configure::write('Company.slogan','Pizza for your body and soul');
 
?>
  1. <?php
  2. Configure::write('Company.name','Pizza, Inc.');
  3. Configure::write('Company.slogan','Pizza for your body and soul');
  4. ?>

Osserva che si utilizza la notazione puntata nel parametro $key. Puoi usare questa notazione per organizzare i dati in gruppi logici.

L'esempio può essere riscritto in una sola riga:

<?php
 
Configure::write(
    'Company',array('name'=>'Pizza, Inc.','slogan'=>'Pizza for your body and soul')
);
 
?>
  1. <?php
  2. Configure::write(
  3. 'Company',array('name'=>'Pizza, Inc.','slogan'=>'Pizza for your body and soul')
  4. );
  5. ?>

Puoi usare Configure::write('debug', $int) per passare al volo tra l'ambiente di produzione e quello di debug. Questa caratteristica è particolarmente utile per le operazioni AMF e SOAP, dove le informazioni di debug possono causare errori.

read(string $key = ‘debug’)

Utilizzato per leggere un valore dalla configurazione dell'applicazione. Di default riporta l'impostazione di debug. Se fornisci una chiave, invece, riporta il suo valore. Utilizzando l'esempio di write() qui sopra, puoi leggere i valori così:

<?php
 
Configure::read('Company.name');    //da come risultato: 'Pizza, Inc.'
Configure::read('Company.slogan');  //da come risultato: 'Pizza for your body and soul'
 
Configure::read('Company');
 
//da come risultato:
 
array('name' => 'Pizza, Inc.', 'slogan' => 'Pizza for your body and soul');
 
?>
  1. <?php
  2. Configure::read('Company.name'); //da come risultato: 'Pizza, Inc.'
  3. Configure::read('Company.slogan'); //da come risultato: 'Pizza for your body and soul'
  4. Configure::read('Company');
  5. //da come risultato:
  6. array('name' => 'Pizza, Inc.', 'slogan' => 'Pizza for your body and soul');
  7. ?>
delete(string $key)

Usato per cancellare la variabile di configurazione.

<?php Configure::delete('Company.name'); ?>
  1. <?php Configure::delete('Company.name'); ?>
load(string $path)

Usato per caricare la configurazione da un file esterno.

/app/config/messages.php:
 
<?php
$config['Company']['name'] = 'Pizza, Inc.';
$config['Company']['slogan'] = 'Pizza for your body and soul';
$config['Company']['phone'] = '555-55-55';
?>
 
<?php
Configure::load('messages');
Configure::read('Company.name');
?>
  1. /app/config/messages.php:
  2. <?php
  3. $config['Company']['name'] = 'Pizza, Inc.';
  4. $config['Company']['slogan'] = 'Pizza for your body and soul';
  5. $config['Company']['phone'] = '555-55-55';
  6. ?>
  7. <?php
  8. Configure::load('messages');
  9. Configure::read('Company.name');
  10. ?>

Osserva che ogni parametro di configurazione è una coppia chiave/valore appartenente all'array $configure. Tutte le altre variabili presenti nel file saranno ignorate dalla funzione load().

version()

Restituisce la versione corrente di CakePHP.

write
write(string $key, mixed $value)
  1. write(string $key, mixed $value)

Use write() to store data in the application’s configuration.

Configure::write('Company.name','Pizza, Inc.');
Configure::write('Company.slogan','Pizza for your body and soul');
  1. Configure::write('Company.name','Pizza, Inc.');
  2. Configure::write('Company.slogan','Pizza for your body and soul');

Note the usage of dot notation in the $key parameter. You can use this notation to organize your configuration into logical groups.

The above example could also be written in a single call:

Configure::write(
    'Company',array('name'=>'Pizza, Inc.','slogan'=>'Pizza for your body and soul')
);
  1. Configure::write(
  2. 'Company',array('name'=>'Pizza, Inc.','slogan'=>'Pizza for your body and soul')
  3. );

You can use Configure::write(‘debug’, $int) to switch between debug and production modes on the fly. This is especially handy for AMF or SOAP interactions where debugging information can cause parsing problems.

read
read(string $key = 'debug')
  1. read(string $key = 'debug')

Used to read configuration data from the application. Defaults to CakePHP’s important debug value. If a key is supplied, the data is returned. Using our examples from write() above, we can read that data back:

Configure::read('Company.name');    //yields: 'Pizza, Inc.'
Configure::read('Company.slogan');  //yields: 'Pizza for your body and soul'
 
Configure::read('Company');
 
//yields: 
array('name' => 'Pizza, Inc.', 'slogan' => 'Pizza for your body and soul');
  1. Configure::read('Company.name'); //yields: 'Pizza, Inc.'
  2. Configure::read('Company.slogan'); //yields: 'Pizza for your body and soul'
  3. Configure::read('Company');
  4. //yields:
  5. array('name' => 'Pizza, Inc.', 'slogan' => 'Pizza for your body and soul');
delete
delete(string $key)
  1. delete(string $key)

Used to delete information from the application’s configuration.

Configure::delete('Company.name');
  1. Configure::delete('Company.name');
load
load(string $path)
  1. load(string $path)

Use this method to load configuration information from a specific file.

// /app/config/messages.php:
<?php
$config['Company']['name'] = 'Pizza, Inc.';
$config['Company']['slogan'] = 'Pizza for your body and soul';
$config['Company']['phone'] = '555-55-55';
?>
 
<?php
Configure::load('messages');
Configure::read('Company.name');
?>
  1. // /app/config/messages.php:
  2. <?php
  3. $config['Company']['name'] = 'Pizza, Inc.';
  4. $config['Company']['slogan'] = 'Pizza for your body and soul';
  5. $config['Company']['phone'] = '555-55-55';
  6. ?>
  7. <?php
  8. Configure::load('messages');
  9. Configure::read('Company.name');
  10. ?>

Note that every configure key-value pair is represented in the file with the $config array. Any other variables in the file will be ignored by the load() function.

version
version()
  1. version()

Returns the CakePHP version for the current application.

Variabili di configurazione generali in CakePHP

La classe Configure ` usata per gestire un set di variabili di configurazione di CakePHP. Queste variabili si trovano in app/config/core.php. Ora descriviamo ciascuna variabile e come il suo utilizzo modifica il comportamento del'applicazione CakePHP.

variabile Configure Descrizione
debug Modifica l'output del debug di CakePHP.

0 = Modalità di Produzione. Nessun output.
1 = Mostra gli errori e gli avvisi.
2 = Mostra gli errori, gli avisi e le query SQL.
3 = Mostra gli errori, gli avvisi, le query SQL e un report completo del controller.
App.baseUrl Commentata. Togli il commento se non intendi utilizzare la modalità mod_rewrite di Apache in CakePHP. Non dimenticare di eliminare anche il file .htaccess.
Routing.admin Togli il commento a questa definizione se vuoi usare il sistema di routing per l'admin. Imposta il valore di questa variabile con il nome che vuoi dare alla tua sezione admin. Imparerai dell'altro su questo argomento più avanti.
Cache.disable Quando è impostato a true, la cache è disabilitata in tutto il sito.
Cache.check Se impostato a true, abilita il caching della view. Nel controller dovrai comunque richiamarlo, ma questa variabile imposta il funzionamento della cache nell'intero sistema.
Session.save Definisce quale meccanismo di salvataggio delle sessioni verrà usato da CakePHP

php = Utilizza il salvataggio preimpostato in php.
cake = Salva la sessione nella directory /app/tmp
database = Salva la sessione in una tabella del database. Assicurati di predisporre la tabella utilizzando il file SQL che trovi in /app/config/sql/sessions.sql.
Session.table Il nome della tabella (senza l'eventuale prefisso) in cui salvare i dati di sessione.
Session.database Il nome del database in cui salvare i dati di sessione.
Session.cookie Il nome del cookie usato per rintracciare la sessione.
Session.timeout Il timeout predefinito in secondi. Il valore attuale dipende dalla variabile Security.level.
Session.start Se impostato a true, la sessione inizia automaticamente.
Session.checkAgent Se impostato a false, CakePHP non controllerà che l'user agent non cambi da una richiesta all'altra.
Security.level Il livello di sicurezza in CakePHP. Il timeout della sessione, definito in 'Session.timeout', è moltiplicato in base a questo settaggio.

Valori ammessi:
'high' = x 10
'medium' = x 100
'low' = x 300
Security.salt A random string used in security hashing.
Acl.classname, Acl.database Costanti usate insieme alla funzionalità Access Control List. Per i dettagli ti rimandiamo alla sezione Access Control Lists.

Attenzione: In core.php ci sono delle altre impostazioni per la cache, le tratteremo più avanti, quindi state all'occhio.

La classe Configure può essere usata per leggere e scrivere variabili di configurazione al volo. Questo è molto utile se vuoi abilitare il debug solo in alcune parti dell'applicazione.

Costanti in Configuration

Anche se molte opzioni di configurazione sono gestite in Configure, ci sono alcune costanti che CakePHP utilizza durante l'esecuzione.

Costante Descrizione
LOG_ERROR Costante di Errore. Usata per differenziare gli errori di log e di debug. PHP attualmente supporta LOG_DEBUG.

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.

Singolari e Plurali, regole personalizzate per la declinazione.

Le convenzioni sui nomi in CakePHP possono essere molto utili - puo chiamare il database big_boxes, il tuo modello BigBox, il controller BogBoxesController, e tutto funziona automaticamente. CakePHP sa come collegare queste cose declinando le parole al singolare e al plurale.

Ma ci sono dei casi (soprattutto per chi non parla inglese) in cui CakePHP non sa come declinare le parole (cosa che fa grazie alla classe inflector, che trasforma i singolari e plurali, ma anche gli under_scores in camelCases). Se CakePHP non riconosce i tuoi plurali, puoi istruirlo su come comportarsi in determinati casi. Il file di configurazione si trova in /app/config/inflections.php.

In questo file trovi sei variabili. Esse permettono di perfezionare il modo in cui CakePHP tratta le inflessioni.

Variabile inflections.php Descrizione
$pluralRules Questo é un array che contiene le espressioni regolari per casi speciali di plurale. Le chiavi dell'array sono le inflessioni che vengono trasformate come indicato nel rispettivo valore.
$uninflectedPlural Un array che contiene parole che non cambiano quando sono al plurale.
$irregularPlural Array che contiene le parole e il rispettivo plurale. Le chiavi rappresentano la forma singolare, i valori la forma plurale. Questo array puó essere usato per parole che non seguono alcuna regola descritta in $pluralRules.
$singularRules Uguale a $pluralRules, ma al contrario: fornisce i singolari per plurali irregolari
$uninflectedSingular Uguale a with $uninflectedPlural, ma per i singolari. Di default é uguale a $uninflectedPlural.
$irregularSingular Uguale a with $irregularPlural, solo con le parole in singolare.

Operazioni preliminari in CakePHP

Se hai bisogno di ulteriori configurazioni, usa il file bootstrap di CakePHP, che si trova in /app/config/bootstrap.php. Questo file viene eseguito subito dopo l'avvio dell'applicazione CakePHP.

Questo file é ideale per molte operazioni preliminari:

  • Definire alcune funzioni
  • Definire costanti globali
  • Definire modelli, controller e viste

Attento peró a mantenere la struttura MVC quando aggiungi qualsiasi cosa nel bootstrap: é facile essere tentati di infilare funzioni di formattazione qui, anche se il loro posta sarebbe altrove.

Resisti all'impulso, e sarai felice di averci lavorato un po' di tempo in piú.

Puoi anche considerare di eseguire queste operazioni nella classe AppController. Questa classe é la classe genitore di tutti i controller della tua applicazione. AppController é un ottimo posto in cui inserire le funzioni di callback e definire metodi condivisi tra tutti i tuoi controllers.