Introduzione
Il framework symfony è un progetto Open Source da più di tre anni ed è diventato uno dei framework PHP più popolari grazie alle molte feature offerte ed all'ottima documentazione. Questa tradizione è iniziata molto presto.
Nel dicembre 2005, appena dopo il primo rilascio ufficiale di symfony, abbiamo pubblicato il "tutorial Askeet", una serie di 24 lezioni pubblicate giornalmente tra il primo dicembre e Natale.
Questo tutorial ha dimostrato di avere un inestimabile valore per la promozione del framework per i nuovi utenti. Molti sviluppatori hanno imparato ad usare symfony grazie ad Askeet, molte aziende usano ancora oggi Askeet come fonte primaria di addestramento degli sviluppatori.
Ma il tutorial Askeet ha iniziato a mostrare i suoi anni e, con il rilascio di symfony 1.2, abbiamo deciso di pubblicare un altro calendario dell'avvento, Jobeet.
Questo tutorial è stato pubblicato giorno per giorno sul blog di symfony nel 2008, mentre quello che state leggendo è la sua incarnazione in libro.
La sfida
Ogni capitolo/giorno è pensato per durare circa un'ora e rappresenta l'occasione per imparare ad utilizzare symfony realizzando un sito web reale dall'inizio alla fine.
Un'ora per ventiquattro volte equivale ad una giornata ed è proprio quanto noi pensiamo sia necessario ad uno sviluppatore per imparare i concetti fondamentali di symfony. Ogni giorno verranno aggiunte nuove feature all'applicazione, e sfrutteremo queste novità per introdurvi alle nuove funzionalità di symfony ed alle good practice dello sviluppo web con symfony.
Per Askeet il ventunesimo giorno fu il "get-a-symfony-guru-for-a-day". Non avevamo piani e la community doveva proporre delle feature da aggiungere ad Askeet. Fu davvero un successo e la community decise che l'applicazione avesse bisogno di un motore di ricerca. E venne fatto. Il giorno 21 del tutorial dimostrò anche di essere una delle parti più famose dell'intero tutorial di Askeet.
Per Jobeet abbiamo festeggiato l'inverno il 21 con una gara di design. Il vincitore è stato centre{source}, ed il suo design è stato usato in questo tutorial. Il design è anche usato dal sito di Jobeet.
Questo tutorial è differente
Ripensate agli albori del PHP4. Ah, la Belle Epoque! PHP era uno dei primi linguaggi dedicati al web ed uno dei più semplici.
Ma con la veloce evoluzione delle tecnologie web gli sviluppatori devono tenersi al passo con le ultime best practice e con gli strumenti più aggiornati. La via migliore per imparare è sicuramente quella di leggere blog, tutorial e libri. Ne abbiamo letti molti, siano scritti per PHP, Python, Java, Ruby, o Perl e molti di essi perdono di vista l'obiettivo finale quando l'autore inizia a dare porzioni di codice come esempio.
Probabilmente siete abituati a leggere avvisi come questi:
"Per un'applicazione reale non dimenticare di aggiungere la validazione ed una corretta gestione degli errori."
oppure
"La sicurezza è lasciata al lettore come esercizio."
o ancora
"Avrete sicuramente bisogno di scrivere dei test."
Cosa? Queste cose sono attività serie. Sono forse le parti più importanti di ogni altra parte di codice. E come lettori venite abbandonati. Senza tenere conto di queste cose gli esempi sono molto meno utili visto che non possono essere usati come punto di partenza. Questo è male! Perché? Perché la sicurezza, la validazione, la gestione degli errori e i test (solo per dirne alcuni) permettono di scrivere codice corretto.
In questo tutorial non vedrete mai frasi come quelle viste in precedenza: scriveremo test, gestiremo errori, valideremo il codice e state pure certi che realizzeremo un'applicazione sicura. Questo è dovuto al fatto che symfony si occupa del codice ma anche di utilizzare le best practice e di mostrare come sviluppare in modo professionale applicazioni per il mondo enterprise. Saremo in grado di fornire questo lusso perché symfony mette a disposizione tutti gli strumenti necessari per affrontare questi aspetti in modo semplice e senza scrivere troppo codice.
Validazione, gestione degli errori, sicurezza e test sono argomenti di prima classe in symfony perciò non servirà molto tempo per spiegarli. Questa è solo una delle molteplici ragioni per usare un framework per realizzare progetti reali.
Tutto il codice che leggerete in questo tutorial potrete usarlo per un progetto reale. Vi incoraggiamo a riutilizzare parti del codice o a "rubare" intere porzioni.
Il progetto
L'applicazione da progettare avrebbe potuto essere un'altra volta il motore di un blog. Ma vogliamo usare symfony per un progetto utile. Lo scopo è quello di dimostrare che symfony può essere utilizzato per sviluppare applicazioni professionali con stile e senza sforzarsi troppo.
Terremo segreto il contenuto del progetto per un altro giorno visto che abbiamo già abbastanza cose da fare oggi. Tuttavia conoscete già il nome dell'applicazione: Jobeet.
Cosa facciamo oggi?
Visto che 24 ore sono molte per sviluppare un'applicazione con symfony, oggi non scriveremo codice PHP. Ma anche senza scrivere una sola riga di codice inizierete a capire i benefici derivanti dall'utilizzo di un framework come symfony già dall'avvio di un nuovo progetto.
L'obiettivo del giorno è quello di impostare l'ambiente di sviluppo e visualizzare una pagina dell'applicazione in un browser web. Questo include l'installazione di symfony, la creazione dell'applicazione e la configurazione del server web.
Prerequisiti
Prima di tutto controllate di avere già a disposizione un ambiente di sviluppo web funzionante con un web server (Apache per esempio), un database engine (MySQL, PostgreSQL, or SQLite) e PHP 5.2.4 o superiore.
Visto che useremo molto la linea di comando sarebbe meglio usare un sistema operativo
Unix-like, ma se si utilizza un sistema Windows funzionerà lo stesso, si dovrà
solo scrivere qualche comando nel prompt cmd
.
note
I comandi della shell Unix possono tornare utili in un sistema Windows.
Se vi può essere utile usare comandi come tar
, gzip
o grep
su Windows
potete installare Cygwin. La documentazione ufficiale
è un po' frammentata, quindi una buona guida all'installazione la potete trovare
qui.
I più avventurosi potrebbero voler provare
Windows Services for Unix
di Microsoft.
Visto che il tutorial si focalizzerà principalmente sul framework symfony, diamo per scontato che abbiate già una buona conoscenza di PHP5 e di programmazione orientata agli oggetti.
Installazione di symfony
Prima di tutto create una cartella per contenere i file relativi al progetto Jobeet:
$ mkdir -p /home/sfprojects/jobeet $ cd /home/sfprojects/jobeet
Su Windows:
c:\> mkdir c:\development\sfprojects\jobeet c:\> cd c:\development\sfprojects\jobeet
note
agli utenti Windows raccomandiamo di eseguire symfony e di creare il nuovo
progetto in un percorso che non contenga spazi.
Evitate l'utilizzo della cartella Documents and Settings
, stessa cosa per qualsiasi
sotto-cartella di My Documents
.
Create una cartella per contenere i file delle librerie del framework symfony:
$ mkdir -p lib/vendor
La pagina di installazione sul sito di symfony elenca e confronta tutte le versioni disponibili di symfony.
Visto che questo tutorial è stato scritto per symfony 1.2, andate alla pagina di installazione di symfony 1.2.
Dentro la sezione "Source Download" troverete l'archivio nei
formati .tgz
e .zip
. Scaricate il pacchetto, salvandolo nella
cartella lib/vendor/
appena creata, ed estraetene i file:
$ cd lib/vendor $ tar zxpf symfony-1.2-latest.tgz $ mv symfony-1.2.0 symfony
Su Windows l'estrazione dal file zip può essere fatta con explorer. Dopo che avrete
rinominato la cartella con symfony
, dovreste vedere una cartella di nome
c:\development\sfprojects\jobeet\lib\vendor\symfony
.
Dal momento che le configurazioni di PHP variano molto da una distribuzione all'altra, abbiamo bisogno di verificare che la vostra configurazione di PHP soddisfi i requisiti minimi di symfony. Lanciare lo script di verifica configurazione fornito con symfony, dalla linea di comando:
$ cd ../.. $ php lib/vendor/symfony/data/bin/check_configuration.php
Se c'è un problema, l'output vi darà suggerimenti su come risolverli. Si dovrebbe inoltre eseguire la verifica da un browser, dal momento che la configurazione del PHP può essere diversa. Copiare il file da qualche parte sotto la cartella principale del server web e accedere al file. Non dimenticare in seguito di rimuovere il file dalla cartella principale del server web.
$ rm web/check_configuration.php
Se lo script non mostra nessun errore, controllare che symfony sia
correttamente installato usando la riga di comando per visualizzare
la versione (attenzione all'uso della V
maiuscola):
$ cd ../.. $ php lib/vendor/symfony/data/bin/symfony -V
Su Windows:
c:\> cd ..\.. c:\> php lib\vendor\symfony\data\bin\symfony -V
Se siete curiosi e volete sapere cosa può fare per voi questa linea di comando,
digitate symfony
per ottenere la lista di tutte le opzioni e dei task disponibili:
$ php lib/vendor/symfony/data/bin/symfony
Su Windows:
c:\> php lib\vendor\symfony\data\bin\symfony
La linea di comando di symfony è il miglior amico dello sviluppatore. Mette a disposizione molti strumenti che aumentano la vostra produttività per le attività giornaliere come la pulizia della cache, la generazione del codice e molto altro.
Inizializzazione del progetto
In symfony, applicazioni che condividono lo stesso modello di dati sono raggruppate in progetti. Per il progetto Jobeet avremo due diverse applicazioni: il frontend ed il backend.
Creazione del progetto
Dalla cartella jobeet
, eseguire il task generate:project
per creare il progetto
symfony:
$ php lib/vendor/symfony/data/bin/symfony generate:project jobeet
Su Windows:
c:\> php lib\vendor\symfony\data\bin\symfony generate:project jobeet
Il task generate:project
genera la struttura di default delle cartelle ed i file
necessari per il progetto stesso:
Cartella | Descrizione |
---|---|
apps/ | Contiene le applicazioni del progetto |
cache/ | I file di cache del progetto |
config/ | I file di configurazione del progetto |
lib/ | Le librerie e le classi del progetto |
log/ | I file di log del framework |
plugins/ | I plugin installati |
test/ | Test unitari e funzionali |
web/ | La cartella principale del web (leggi sotto) |
note
Perché symfony genera così tanti file? Uno dei maggiori benefici di usare un framework full-stack è quello di standardizzare ciò che sviluppate. Grazie alla struttura di default di symfony dei file e delle cartelle, ogni sviluppatore con un minimo di conoscenza di symfony potrà occuparsi della manutenzione di un progetto symfony. In pochi minuti sarà in grado di tuffarsi nel codice risolvendo bug e aggiungendo nuove feature.
Il task generate:project
ha inoltre creato un collegamento symfony
nella
cartella principale del progetto Jobeet per dover scrivere meno caratteri ogni volta
che si utilizza un task.
Quindi, da ora in poi, invece che usare l'intero percorso per l'eseguibile di symfony
useremo la scorciatoia symfony
.
Creazione dell'applicazione
Ora create l'applicazione frontend usando il task generate:app
:
$ php symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend
tip
Visto che il file symfony è eseguibile, gli utenti Unix possono sostituire tutte le
occorrenze di 'php symfony
' con './symfony
' da qui in avanti.
Su Windows potete copiare il file 'symfony.bat' nel vostro progetto ed utilizzare
'symfony
' invece che 'php symfony
':
c:\> copy lib\vendor\symfony\data\bin\symfony.bat .
Basandosi sul nome dell'applicazione, il task generate:app
ha creato
la struttura di default delle cartelle necessarie ad un'applicazione
nella cartella apps/frontend
:
Cartella | Descrizione |
---|---|
config/ | I file di configurazione dell'applicazione |
lib/ | Le librerie e le classi dell'applicazione |
modules/ | Il codice dell'applicazione (MVC) |
templates/ | I file globali dei template |
tip
Tutti i comandi symfony
devono essere eseguiti nella cartella principale
a meno che non sia specificato diversamente.
Usando il task generate:app
, abbiamo passato anche due opzioni
relative alla sicurezza:
--escaping-strategy
: Abilita l'escape dell'output per prevenire gli attacchi XSS--csrf-secret
: Abilita i token di sessione per i form per prevenire gli attacchi CSRF
Passando questi due parametri opzionali al task abbiamo messo in sicurezza gli sviluppi futuri dell'applicazione dalle due principali vulnerabilità riscontrate sul web. È esatto, symfony predispone in modo automatico le misure di sicurezza al posto nostro.
Il path di symfony
Potete ottenere la versione di symfony in uso nel vostro progetto digitando:
$ php symfony -V
L'opzione -V
mostra anche il path della cartella di installazione di symfony
che dovreste trovare in config/ProjectConfiguration.class.php
:
// config/ProjectConfiguration.class.php require_once '/Users/fabien/work/symfony/dev/1.2/lib/autoload/sfCoreAutoload.class.php';
Per una migliore portabilità cambiate il path assoluto all'installazione di symfony con il path relativo:
// config/ProjectConfiguration.class.php require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
In questo modo potrete spostare la cartella del progetto Jobeet ovunque sulla vostra macchina o su un'altra ed il progetto continuerà a funzionare.
Gli ambienti
Se date un'occhiata alla cartella web/
, troverete due file PHP:
index.php
e frontend_dev.php
. Questi file sono chiamati front
controller: tutte le richieste all'applicazione vengono fatte tramite loro. Ma perché
abbiamo due front controller se abbiamo definito una sola applicazione?
Entrambi i file puntano alla stessa applicazione, ma per diversi ambienti. Mentre sviluppate un'applicazione, escluso quando si sviluppa direttamente sul server di produzione, avete bisogno di diversi ambienti:
- L'ambiente di sviluppo: È l'ambiente usato dai web developer quando lavorano sull'applicazione, per aggiungere nuove feature, risolvere bug, ...
- L'ambiente di test: Quest'ambiente è utilizzato per testare in modo automatico l'applicazione.
- L'ambiente di staging: Quest'ambiente è utilizzato dal cliente per testare l'applicazione e riportare bug o feature mancanti.
- L'ambiente di produzione: Questo è l'ambiente con cui gli utenti finali interagiscono.
Cosa rende un ambiente unico? Nell'ambiente di sviluppo ad esempio, l'applicazione necessita di scrivere nei log tutti i dettagli di una richiesta per rendere più semplice il debug, ma il sistema di cache deve essere disabilitato, per fare in modo che tutte le modifiche apportate al codice siano subito disponibili. Quindi l'ambiente di sviluppo deve essere ottimizzato per lo sviluppatore. L'esempio migliore è quando viene sollevata un'eccezione. Per aiutare lo sviluppatore nel debug del problema, symfony mostra l'eccezione con tutte le informazioni disponibili sulla richiesta corrente all'interno del browser:
Ma nell'ambiente di produzione la cache deve essere abilitata, e l'applicazione deve mostrare messaggi di errore personalizzati, piuttosto che semplici eccezioni. In questo modo l'ambiente di produzione deve essere ottimizzato per le performance e per la user experience dell'utente finale.
Un ambiente di symfony è un unico insieme di configurazioni. Il framework
symfony si presenta con tre ambienti prestabiliti: dev
, test
e prod
.
Durante il giorno 22, imparerete come creare nuovi ambienti, come quello
di stage
.
Se aprite i file dei front controller, potrete notare che il contenuto è lo stesso, tranne per l'impostazione dell'ambiente:
// web/index.php <?php require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php'); $configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false); sfContext::createInstance($configuration)->dispatch();
note
Definire un nuovo ambiente per symfony è semplice quanto creare un nuovo front controller. Vedremo più avanti come cambiare le impostazioni di un ambiente.
Setup del server Web: la via brutta
Nella sezione precedente è stata creata una cartella per contenere il progetto Jobeet. Se l'avete creata da qualche parte dentro la cartella principale web del vostro server web, siete in grado di accedere al progetto da un browser web.
Chiaramente, visto che non è richiesta nessuna configurazione, il tutto è stato
molto rapido da realizzare, tuttavia provate ad accedere al file config/databases.yml
nel vostro browser per capire quante pericolose conseguenze può implicare
questo modo di agire dettato dalla pigrizia. Se l'utente sa che il sito
è stato sviluppato con symfony, avrà accesso a molti file sensibili.
Mai e poi mai utilizzare un setup di questo tipo su un server in produzione e leggete la prossima sezione per imparare a configurare correttamente il vostro web server.
Setup del server Web: la via sicura
Una buona pratica web è quella di mettere nella cartella principale web solamente i
file che devono essere utilizzati da un browser web come fogli di stile, JavaScript
e immagini. Come da default vi suggeriamo di salvare questi file dentro la sotto-cartella
web
del progetto symfony.
Se date uno sguardo a questa cartella troverete alcune sotto-cartelle per i materiali
web (css/
e images/
) e i due file dei front controller. Questi sono gli unici
file PHP che necessitano di essere nella cartella principale web. Tutti gli altri
file PHP possono essere nascosti al browser, questa è una buona idea in
termini di sicurezza.
Configurazione del Web Server
Ora è il momento di modificare la configurazione di Apache per rendere il nuovo progetto accessibile a tutti.
Trovate e aprite il file di configurazione httpd.conf
e aggiungete le seguenti
configurazioni alla fine:
# Assicuratevi di avere questa linea una sola volta nel file NameVirtualHost 127.0.0.1:8080 # Questa è la configurazione per Jobeet Listen 127.0.0.1:8080 <VirtualHost 127.0.0.1:8080> DocumentRoot "/home/sfprojects/jobeet/web" DirectoryIndex index.php <Directory "/home/sfprojects/jobeet/web"> AllowOverride All Allow from All </Directory> Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf <Directory "/home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf"> AllowOverride All Allow from All </Directory> </VirtualHost>
note
L'alias /sf
permette l'accesso alle immagini ed ai javascript
necessari per la corretta visualizzazione delle pagine di default di symfony
e della web debug toolbar.
Su Windows dovrete sostituire la riga dell'Alias
con qualcosa come:
Alias /sf "c:\development\symfony\data\web\sf"
e /home/sfprojects/jobeet/web
dovrà essere rimpiazzata con:
c:\development\sfprojects\jobeet\web
Questa configurazione mette Apache in ascolto sulla porta 8080
della vostra macchina,
quindi il sito Jobeet sarà accessibile dal seguente URL:
http://~localhost~:8080/
Potete cambiare 8080
con qualsiasi numero, preferendo comunque numeri maggiori
di 1024
, visto che non richiedono privilegi amministrativi.
Provare la nuova configurazione
Riavviate Apache e verificate di avere accesso alla nuova applicazione aprendo
il browser e digitando http://localhost:8080/index.php/
o
http://jobeet.localhost/index.php/
in base alla configurazione di Apache
selezionata nella sezione precedente.
note
Se avete il modulo di Apache ~mod_rewrite~
installato, potete
rimuovere la parte /index.php/ da tutti gli URL. Questo è possibile
grazie alle regole di riscrittura configurate nel file web/.~htaccess~
.
Potete anche provare ad accedere all'applicazione nell'ambiente di sviluppo. Digitate il seguente URL:
http://jobeet.localhost/frontend_dev.php/
La web debug toolbar dovrebbe apparire nell'angolo in alto a destra, incluse delle piccole icone
a riprova del fatto che la configurazione dell'alias sf/
è corretta.
La web debug toolbar è presente su tutte le pagine nell'ambiente di sviluppo e dà accesso a molte informazioni, cliccando sulle varie linguette: la configurazione attuale dell'applicazione, i log per la richiesta corrente, i comandi SQL eseguiti sul database, informazioni sulla memoria e sui tempi.
note
Il setup è leggermente diverso se volete utilizzare symfony su un server IIS in un ambiente Windows. Trovate come configurare il tutto in questo tutorial.
Subversion
È una buona abitudine usare un sistema di controllo delle versioni mentre si sviluppa un'applicazione web. Usare un sistema di controllo delle versioni permette di:
- lavorare in sicurezza
- tornare ad una versione precedente se qualche modifica blocca qualcosa
- permette a più persone di lavorare in modo efficiente sul progetto
- avere accesso a tutte le versioni successive dell'applicazione
In questa sezione descriveremo come usare Subversion con symfony. Se usate un altro strumento per il sistema di controllo delle versioni, dovrebbe essere abbastanza semplice adattare quanto descritto per Subversion.
Ipotizziamo che si disponga già di un accesso ad un server Subversion e di un accesso HTTP ad esso.
tip
Se non avete un server Subversion a disposizione, potete creare un repository in modo gratuito su Google Code o anche cercare "free subversion repository" su Google per avere molte più opzioni.
Innanzitutto, create un nuovo repository per il progetto jobeet
:
$ svnadmin create /path/to/jobeet/repository
Sulla vostra macchina, create la struttura di base delle cartelle:
$ svn mkdir -m "creata struttura la base delle cartelle" http://svn.example.com/jobeet/trunk http://svn.example.com/jobeet/tags http://svn.example.com/jobeet/branches
Ed eseguite il checkout della cartella vuota trunk/
:
$ cd /home/sfprojects/jobeet $ svn co http://svn.example.com/jobeet/trunk/ .
Poi rimuovete il contenuto delle cartelle cache/
e log/
, visto che
non intendiamo inserirle nel repository.
$ rm -rf cache/* log/*
Ora assicuratevi di impostare i giusti permessi di scrittura sulle cartelle cache
e log
, per fare in modo che il web server possa scriverci dentro:
$ chmod 777 cache/ log/
Ora, importate tutti i file e le cartelle:
$ svn add *
Siccome non avremo mai bisogno di eseguire il commit per file delle cartelle
cache/
e /log
, potete specificare delle opzioni di "ignore":
$ svn propedit svn:ignore cache
L'editor di testo di default configurato per SVN dovrebbe aprirsi. Subversion deve ignorare tutti i contenuti delle seguenti cartelle:
*
Salvare e uscire. Abbiamo finito.
Ripetere la procedura per la cartella log/
:
$ svn propedit svn:ignore log
E inserite:
*
Infine, eseguire la prima importazione:
$ svn import -m "prima importazione" . http://svn.example.com/jobeet/trunk
tip
Gli utenti Windows~ possono usare il client TortoiseSVN per gestire i propri repository subversion.
A domani
Bene, il tempo per oggi è finito! Anche se non abbiamo ancora iniziato a parlare di symfony abbiamo impostato un solido ambiente di sviluppo, abbiamo parlato di alcune best practice riguardanti lo sviluppo web e siamo pronti per iniziare a scrivere codice.
Domani sveleremo ciò che l'applicazione farà e parleremo dei requisiti che dovremo implementare nel tutorial.
note
Se volete guardare il codice di oggi, o di un altro giorno, il sorgente
è disponibile su base giornaliera nel repository ufficiale SVN di Jobeet
(http://svn.jobeet.org/propel/
).
Ad esempio, si può ottenere il codice di oggi eseguendo il checkout
del tag release_day_01
:
$ svn co http://svn.jobeet.org/propel/tags/release_day_01/ jobeet/
This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License license.