In questo articolo presento CakePHP, web framework per PHP.
Per chi non lo sapesse, PHP è un linguaggio di scripting per pagine web dinamiche. Con le eventuali interazioni con il database, permette di realizzare con facilità siti dinamici (gestione news, e-commerce…) e applicazioni web-based (ad es: gestionali online multiutente, installabili in locale o su server online). La maggior parte degli hosting, anche i più economici supportano scripting php. Data la sua forte crescita, licenza d’uso gratuita, facilità d’uso, presenza di molte librerie già pronte, è una delle soluzioni più adottate per le esigenze di piccole e media imprese.
Nello sviluppare un’applicazione complessa, ci si ritrova spesso davanti a implementare funzionalità simili complicate, è quindi fortemente consigliato l’utilizzo di un framework per velocizzare i tempi, ridurre gli errori, concentrarsi più ad alto livello sull’applicazione ed avere altri vantaggi.
Perchè proprio CakePHP ?
Al momento i migliori framework per PHP sono all’incirca Zend, Symphony e CakePHP (cakephp.org).
In questo articolo presento l’ultimo di questi, in quanto ha una bassa curva di apprendimento, è ben documentato, molto utilizzato (trovate molti tutorial e guide all’uso), funziona con MVC, supporta Ajax, caching e, diversamente dai primi 2, gira anche con PHP4.
Se volete analizzare meglio le differenze di funzionalità tra i framework disponibili, cercate su google “php framework comparison chart”.
I framework che trovate non sono in alternativa, ma pensati in modo diverso e con ambiti di funzionalità diversi. Se vi chiedono di realizzare un’applicazione, sarebbe l’ideale avere un’idea di alcuni di essi, in modo da scegliere il più adatto. E’ possibile anche usarne più di uno per la stessa applicazione, ad esempio uno per il backend e uno per il frontend e/o un altro per una funzionalità precisa, Zend e Symphony lavorano insieme senza troppi problemi per esempio.
Iniziamo ! primi passi e nozioni di base…
Scaricate l’ultima versione stabile ed estraetela. Al momento l’ultima è la 1.1.19.6305. Vi trovate una struttura con un file index.php (questo file è il primo file chiamato dal client, elabora tutte le richieste del client e le smista ai componenti interni). La cartella “cake” contiene il motore del framework, mentre in “app” metteremo tutti i sorgenti della nostra applicazione. Questa struttura di directories e files va posizionata tale e quale nel webserver.
Nella root non ci va nessun altro file. Se una url per il client è ad esempio
http://percorso_app:porta/gestione/news/insert,
non significa che abbiamo una struttura di directories gestione/news/insert, ma che verrà chiamata (in http) la pagina index.php passando la stringa
“gestione/news/insert“.
Questo sistema è dovuto a MVC, un pattern architetturale che consente di separare logica applicativa e interfacce utente. Tralasciando la classica definizione di MVC, che non è facilmente intuibile, per ora ci basta sapere che il view gestisce l’interfaccia utente, il model contiene e gestisce i contenuti, il controller gestisce la logica applicativa.
Esempio
Propongo un esempio minimale, un inserimento di news sull’homepage. Se usate Windows, potete testare benissimo in locale, ad esempio con EasyPHP (easyphp.org) che comprende l’ambiente WAMP (windows, apache web server, mysql database server, php linguaggio di scripting) già funzionante dopo la prima installazione senza configurazioni. Se usate linux sarete sicuramente degli smanettoni quindi non avrete penso problemi a scaricarvi i pacchetti e configurarvi l’ambiente
1.preparazione ambiente
Create la tabella con phpmyadmin per le news (riporto la query di creazione):
CREATE TABLE `news` (
`id` INT( 3 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`titolo` VARCHAR( 255 ) NOT NULL ,
`testo` TEXT NOT NULL
)
Inserite anche qualche record di prova.
Andate in app/config, copiate il file database.php.default in database.php, aprendolo vedete che di default viene usato mysql come database, cambiatelo se volete usare SQLite o altri. Inseriteci i parametri di connessione (db, user, pass). Per EasyPHP, lo user è root, la password è vuota.
Servirebbe abilitare MOD_REWRITE nel webserver apache, funzionalità che permette di mappare le url http in percorsi fisici diversi attraverso configurazioni apache o file .htaccess. Se il vostro server non lo supporta, andate in app/config/core.php e decommentate la riga
define (’BASE_URL’, env(’SCRIPT_NAME’));
2. pagine per lettura news
Passiamo a scrivere il codice per l’applicazione. Siccome funziona tutto con MVC, iniziamo a creare il modello (con il contenuto).
Creare il file app/models/news.php, che contiene la classe omonima News (importante: con lettera maiuscola) che deve estendere la classe AppModel
<?php
class News extends AppModel
{
var $name = ‘News’;
}
?>
Creiamo adesso il controller in app/controllers/news_controller.php che estende da AppController.
Questa volta abbiamo in più il metodo index() ovvero il metodo principale che viene chiamato per costruire la pagina, in questo caso (vedi codice seguente) settiamo la variabile news con i record del database.
<?php
class NewsController extends AppController
{
var $name = ‘News’;
function index()
{
$this->set(’news’, $this->News->findAll());
}
}
?>
Terza cosa da creare è la vista, ovvero il file che mostra l’elenco dei records. A questo file, la findAll() passa l’array news (settato sopra dal controller con la set), che per elemento, quindi chiave News, contiene l’array super-globale con i record. Mi spiego meglio con il codice (da inserire in app/views/news/index.thtml).
<h1>News sito</h1>
<table>
<tr>
<th>Id</th>
<th>Titolo</th>
</tr>
<?php foreach ($news as $post): ?>
<tr>
<td><?php echo $post['News']['id']; ?></td>
<td>
<?php echo $html->link($post['News']['titolo'], “/news/leggi/”.$post['News']['id']); ?>
</td>
</tr>
<?php endforeach; ?>
</table>
Aprendo
http://localhost/<root_cake>/index.php/news/index/
ottenete la pagina con l’elenco delle news (se avete MOD_REWRITE attivato, non serve specificare la parte di url index.php/).
Come vedete sul titolo di ogni news c’è un link sul titolo che porta a /news/leggi/<id record>. Il contenuto dei questa ultima pagina, sarà restituito dalla funzione omonima leggi($id) dentro il controller, così come la url della index è data dalla funzione index(). In pratica la pagina news/azione/id verrà costruita chiamando il metodo azione() del controller e passandoci l’id alla funzione.
Aggiungiamo quindi la funzione seguente a news_controller.php
function leggi($id = null)
{
$this->News->id = $id;
$this->set(’news’, $this->News->read());
}
Analogamente alla index(), viene setta la variabile news con il record avente id uguale a $id, in modo che il view la possa usare.
Creiamo app/views/news/leggi.thtml e inseriamo la semplice stampa della news
<h1><?php echo $news['News']['titolo']?></h1>
<p><?php echo $news['News']['testo']?></p>
Riaprendo con il browser la pagina vediamo che i links sui titoli portano alle pagine con i dettagli della news.
3.pagine di inserimento/modifica record
Aggiungiamo al controller il metodo add() che gestisce :
function add()
{
if (!empty($this->data) &&
$this->News->save($this->data))
$this->flash(’News inserita.’,'/news’);
}
Ancora una volta aggiungiamo il corrispondente view in app/views/news/add.thtml, che stampa il form di inserimento
<h1>Inserisci news</h1>
<form method=”post” action=”<?php echo $html->url(’/News/add’)?>”>
<p>
titolo:
<?php echo $html->input(’News/titolo’, array(’size’ => ‘40′))?>
<?php echo $html->tagErrorMsg(’News/titolo’, ‘Titolo obbligatorio.’) ?>
</p>
<p>
Testo:
<?php echo $html->textarea(’News/testo’, array(’rows’=>’10′)) ?>
<?php echo $html->tagErrorMsg(’News/testo’, ‘Testo obbligatorio.’) ?>
</p>
<p>
<?php echo $html->submit(’Salva’) ?>
</p>
</form>
In pratica chiamando la url news/add ci troviamo un form che al submit inserisce i dati.
Per creare la pagina di editing dei record, scrivete la funzione edit() in modo che se passate qualche dato chiami la save(), altrimenti chiama la read() dopo aver settato l’id.
function edit($id = null)
{
if (empty($this->data))
{
$this->News->id = $id;
$this->data = $this->News->read();
}
else
{
if ($this->News->save($this->data['News']))
{
$this->flash(’News aggiornata.’,'/News’);
}
}
}
Nel corrispondente view (edit.thtml) dobbiamo ricordarci di inserire il campo (hidden) id nel form, altrimenti in ricezione non riusciamo a capire quale record stiamo modificando.
Potete creare a questo punto un metodo e relativo view con l’elenco news e links per l’editing, in modo analogo alla index() con i link per vedere il testo della news. Tralascio il codice del controller e del view dell’editing per motivi di spazio.
4. ritocchi
Andate in app/config/routes.php, qui potete cambiare i mappaggi dei path delle url nei relativi controller e azioni predefinite. Mappando ad esempio il path root “/” con il controller news e action index, chiamando con il browser “/”, il contenuto sarà quello di /news/index.
Le pagine vanno ovviamente tra loro collegate con dei link, che come abbiamo visto si creano con
$html->link(“descrizione”, “/controller/action/id”).
Altre funzionalità
Con procedure simili potete creare i form di login.
Gli stili css sono facilmente inseribili, basta modificare quello di default, e questo va in automatico in tutte le pagine che vengono generate.
Guardatevi dal sito ufficiale la documentazione e le nuove funzioni, ci sono (direttamente o tramite plugin) librerie per la maggior parte delle esigenze di applicazioni web: session, cookie, xml, plugin ajax, siti multilingua, rss, socket http, form validation, scaffolding, email, time, javascript, soap per web services, pdf…
Potete anche configurare cosa viene dato all’utente se chiama una pagina (ovvero un metodo nel controller) che non esiste.
Guardatevi i files di configurazione dentro /app/config per personalizzare il comportamento generale del framework.
Conclusioni
Le procedure vi potranno sembrare apparentemente complesse per creare un’applicazione così semplice. Il funzionamento generale è che una pagina che l’utente vede non è una pagina scritta apposta, ma è data da una funzione dentro un controller. Lavorando in questo modo, ragionate sul sito/applicazione come un’unica entità, non come una moltitudine di pagine. Non dovrete mai fare una cosa due volte in questo modo. Se in alcune o tutte le pagine volete qualcosa (javascript, css, footer, menu di navigazione) basta che lo specifichiate una volta sola, riducendo al minimo la possibilità di errori.
Se ci pensate bene avete un’enormità di vantaggi lavorando in questo modo, derivanti sia dal modo di lavorare ad “alto livello”, sia da templating automatico delle pagine, facile controllo e manutenibilità del codice, scrittura html ridotta al minimo (non dovete scrivere i tag html, head, body ecc…, vengono scritti nel rispetto delle regole W3C dal motore di cakephp), una libreria di funzioni e patterns già implementati molto ricca. Ci sono anche dei vantaggi “invisibili”: tutte le pagine generate e relative chiamate al database server appesantiscono al minimo il carico di lavoro del server grazie al sistema di caching integrato.
CakePHP è distribuito con licenza gratuita MIT, simile alla GPL. In pratica potete farci tutto, ma se lo modificate dovete ridistribuirlo con la stessa licenza.
Dal punto di vista della sicurezza, dato che è distribuito con il codice sorgente, tenete conto che all’esterno l’applicazione è molto esposta.
Buon Lavoro !



Leave a comment