Giorno 1: Impostare il progetto

Introduzione

Il framework symfony è un progetto Open Source da più di quattro anni ed è diventato uno dei framework PHP più popolari grazie alle molte feature offerte e all'ottima documentazione. Questa tradizione è iniziata molto presto.

Questo libro descrive la creazione di una applicazione web passo-passo con il framework symfony dalle specifiche alla implementazione. È rivolto ai principianti che vogliono imparare symfony, capire come funziona e anche conoscere le migliori pratiche di sviluppo web.

L'applicazione da creare avrebbe potuto essere un'altra volta il motore di un blog. Ma vogliamo usare symfony per un progetto utile. L'obiettivo è dimostrare che symfony può essere usato per sviluppare applicazioni professionali con stile e sforzo minimo.

Manterremo il contenuto del progetto segreto per un altro giorno, dal momento che abbiamo abbastanza cose da fare oggi. Tuttavia diamogli un nome: Jobeet.

Ogni capitolo/giorno è pensato per durare circa un'ora e rappresenta l'occasione per imparare a utilizzare symfony realizzando un sito web reale dall'inizio alla fine. Ogni giorno verranno aggiunte nuove feature all'applicazione, e sfrutteremo queste novità per introdurvi alle nuove funzionalità di symfony e alle good practice dello sviluppo web con symfony.

Questo tutorial è differente

Ripensate agli albori del PHP4. Ah, la Belle Epoque! PHP era uno dei primi linguaggi dedicati al web e 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 e 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 libro non si vedranno 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 si leggerà in questo libro potrà essere usato per un progetto reale. Incoraggiamo a riutilizzare parti del codice o a "rubare" intere porzioni.

Cosa facciamo oggi?

Oggi non scriveremo codice PHP. Ma anche senza scrivere una sola riga di codice si inizieranno a capire i benefici derivanti dall'utilizzo di un framework come symfony già dall'avvio di un nuovo progetto.

L'obiettivo di questo capitolo è 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 installare symfony è necessario verificare che nel computer sia tutto correttamente installato e configurato. È meglio prendere ora il tempo necessario per seguire tutti i passi richiesti per la verifica della configurazione, perché può fare risparmiare tempo in seguito.

Software di terze parti

Prima di tutto, è necessario verificare che il computer disponga di un ambiente di lavoro per lo sviluppo web. Come minimo, è necessario un server web (Apache, per esempio), un database (MySQL, PostgreSQL, SQLite, o qualunque database compatibile con PDO) e PHP 5.2.4 o superiore.

Interfaccia a linea di comando

Il framework symfony contiene uno strumento a linea di comando che aiuta ad automatizzare gran parte del lavoro. Gli utenti dei sistemi operativi della famiglia Unix, si sentiranno a casa. Se si utilizza un sistema Windows, funzionerà lo stesso, si dovrà solo digitare alcuni comandi nel prompt di cmd.

I comandi della shell Unix possono tornare utili in un sistema Windows. Per poter usare comandi come tar, gzip o grep su Windows si può installare Cygwin. La documentazione ufficiale è un po' frammentata, quindi ecco una buona guida all'installazione. I più avventurosi potrebbero voler provare Windows Services for Unix di Microsoft.

~Configurazione di PHP~

Poiché le configurazioni di PHP possono variare da un sistema operativo a un'altro, è necessario controllare che la configurazione di PHP soddisfi i requisiti minimi di symfony.

Per prima cosa, assicurarsi di avere installato come minimo PHP 5.2.4. utilizzando la funzione di PHP phpinfo(), oppure lanciando php -v nella linea di comando. Siate consapevoli del fatto che su alcune configurazioni, è possibile avere due diverse versioni di PHP installati: uno per la riga di comando e un altro per il web.

Dopo, scaricare lo script di symfony per verificare la configurazione, al seguente indirizzo web:

http://sf-to.org/1.4/check.php

Salvare lo script da qualche parte sotto la cartella principale del server web.

Lanciare lo script per verificare la confgurazione dalla linea di comando:

$ php check_configuration.php

Se c'è un problema con la configurazione di PHP, l'output del comando darà suggerimenti su cosa correggere e come risolvere il problema.

Si dovrebbe anche eseguire la verifica da un browser e mettere a posto i problemi che si potrebbero verificare. Questo perché PHP può avere distinti file di cofigurazione php.ini per questi due ambienti, con impostazioni diverse.

Successivamente, non dimenticarsi di rimuovere il file dalla cartella web.

~Installazione~ di symfony

Prima di tutto creare 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

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.

Se si cra la cartella per il progetto di symfony sotto la cartella principale del server web, non c'è bisogno di configurare il web server. Naturalmente, per l'ambiente di produzione, si consiglia vivamente di configurare il server web, come spiegato nella sezione di configurazione del server web.

Scegliere la versione di symfony

Ora bisogna installare symfony. Poiché il framework symfony ha diverse versioni stabili, bisogna scegliere quella che si vuole installare, leggendo la pagina di installazione sul sito web di symfony.

Questo libro assume che si voglia installare symfony 1.3 o symfony 1.4.

Scegliere dove installare symfony

È possibile installare symfony globalmente sulla propria macchina o incorporarlo in ogni progetto. Il secondo metodo è quello consigliato, in questo modo i progetti saranno totalmente indipendenti gli uni dagli altri. Aggiornare l'installazione locale di symfony non crea problemi imprevisti sui progetti. Ciò significa che si potranno avere progetti su diverse versioni di symfony, con la possibilità aggiornarli singolarmente, in base alla necessità.

Utilizzando una delle migliori prassi, molte persone installano i file del framework di symfony nella cartella lib/vendor del progetto. Quindi iniziamo con il creare questa cartella:

$ mkdir -p lib/vendor

L'installazione di symfony

Installazione da un archivio

Il modo più semplice per installare symfony è quello di scaricare l'archivio per la versione scelta dal sito web di symfony. Andare nella pagina con le installazioni e prendere la versione scelta, ad esempio symfony 1.4.

Dentro la sezione "Source Download" si troverà l'archivio nei formati .tgz e .zip. Scaricate il pacchetto, salvandolo nella cartella lib/vendor/ appena creata, ed estrarne i file:

$ cd lib/vendor
$ tar zxpf symfony-1.4.0.tgz
$ mv symfony-1.4.0 symfony
$ rm symfony-1.4.0.tgz

Su Windows l'estrazione dal file zip può essere fatta con explorer. Dopo aver rinominato la cartella in symfony, si dovrebbe avere una cartella di nome c:\development\sfprojects\jobeet\lib\vendor\symfony.

Installazione da Subversion (raccomandata)

Se si usa Subversion, è meglio utilizzare la proprietà svn:externals per incorporare symfony nella cartella lib/vendor/ del progetto:

$ svn pe svn:externals lib/vendor/

L'importazione del progetto in un nuovo repository Subversion è spiegata alla fine di questo capitolo.

Se tutto procede bene, questo comando lancierà l'editor preferito per dare la possibilità di configurare le fonti esterne di Subversion.

Su Windows, si possono usare programmi come TortoiseSVN per fare ogni cosa relativa all'svn, senza la necessità di usare la console.

I conservatori possono legare il progetto a una versione specifica (un tag Subversion):

symfony http://svn.symfony-project.com/tags/RELEASE_1_4_0

Ogni volta che esce una nuova versione (annunciata nel blog) di symfony, sarà necessario cambiare l'URL alla nuova versione.

I temerari possono utilizzare il ramo 1.4:

symfony http://svn.symfony-project.com/branches/1.4/

Utilizzando il ramo, il progetto beneficia automaticamente delle correzioni dei bug ogni volta che si esegue un aggiornamento con svn update.

Verificare l'installazione

Ora che symfony è installato, verificare che ogni cosa funzioni correttamente, utilizzando la linea di comando di symfony 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 si è curiosi di sapere cosa può fare questa linea di comando, digitare 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 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~ e 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 $ php lib/vendor/symfony/data/bin/symfony generate:project jobeet --orm=Propel

Su Windows:

c:\> php lib\vendor\symfony\data\bin\symfony generate:project jobeet

Il task generate:project genera la ~struttura~ di default delle cartelle e 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)

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 frontend

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 si può copiare il file 'symfony.bat' nel progetto e 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 a 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

Tutti i comandi symfony devono essere eseguiti nella cartella principale a meno che non sia specificato diversamente.

Permessi per le cartelle

Prima di tentare di accedere al progetto appena creato, è necessario impostare i permessi di scrittura sulle cartelle della cache/ e dei log/ ai livelli appropriati, in modo che il server web possa scriverci:

$ chmod 777 cache/ log/

Setup del ~server web~: la via brutta

Nella sezione precedente è stata creata una cartella per contenere il progetto Jobeet. Se è stata creata da qualche parte dentro la ~cartella principale web~ del server, si è in grado di accedere al progetto da un browser web.

Chiaramente, visto che non è richiesta nessuna configurazione, il tutto è stato molto rapido da realizzare, se tuttavia si prova ad accedere al file config/databases.yml nel vostro browser, si può 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, leggere la prossima sezione per imparare a configurare correttamente il proprio server web.

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 impostazione predefinita, suggeriamo di salvare questi file dentro la sotto-cartella web del progetto symfony.

Dando uno sguardo a questa cartella, si troveranno 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 server web

Ora è il momento di modificare la configurazione di ~Apache~ per rendere il nuovo progetto accessibile a tutti.

Trovare e aprire il file di configurazione httpd.conf e aggiungere le seguenti configurazioni alla fine:

# Assicurarsi 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>

L'~alias~ /sf permette l'accesso alle immagini e ai javascript necessari per la corretta visualizzazione delle ~pagine di default di symfony~ e della web debug toolbar.

Su ~Windows~ occorre 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 propria macchina, quindi il sito Jobeet sarà accessibile dal seguente URL:

http://~localhost~:8080/

Si può cambiare 8080 con qualsiasi numero, preferendo comunque numeri maggiori di 1024, visto che non richiedono privilegi amministrativi.

Provare la nuova configurazione

Riavviare Apache e verificare 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.

Congratulazioni

Se si ha il modulo di Apache ~mod_rewrite~ installato, si può rimuovere la parte /index.php/ da tutti gli URL. Questo è possibile grazie alle regole di riscrittura configurate nel file web/.~htaccess~.

Si può anche provare ad accedere all'applicazione nell'ambiente di sviluppo. Digitare il seguente URL:

http://jobeet.localhost/frontend_dev.php/

La web debug toolbar dovrebbe apparire nell'angolo in alto a destra, con delle piccole icone a riprova del fatto che la configurazione dell'alias sf/ è corretta.

web debug toolbar

La configurazioe è leggermente differente se si vuole lanciare symfony su un server IIS in un ambiente Windows. Le modalità di configurazione si trovano sul relativo tutorial.

Gli ~ambienti~

Se si dà un'occhiata alla cartella web/, si troveranno 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, occorrono 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:

Un'eccezione nell'ambiente di sviluppo

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 prestazioni e per la user experience dell'utente finale.

Un'eccezione nell'ambiente di produzione

Se si aprono i file dei front controller, si può 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();
 

La web debug toolbar è un ottimo esempio dell'utilizzo di un ambiente. 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.

~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 a una versione precedente se qualche modifica blocca qualcosa
  • lavorare in più persone 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 a un server Subversion e di un accesso HTTP a esso.

Se non si ha un server Subversion a disposizione, si può creare un repository in modo gratuito su Google Code o anche cercare "free subversion repository" su Google per avere molte più opzioni.

Innanzitutto, creare un nuovo repository per il progetto jobeet:

$ svnadmin create /path/to/jobeet/repository

Sulla propria macchina, creare 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

Eseguire il checkout della cartella vuota trunk/:

$ cd /home/sfprojects/jobeet
$ svn co http://svn.example.com/jobeet/trunk/ .

Poi rimuovere il contenuto delle cartelle cache/ e log/, visto che non intendiamo inserirle nel repository.

$ rm -rf cache/* log/*

Ora assicurarsi di impostare i giusti permessi di scrittura sulle cartelle cache e log, per fare in modo che il server web possa scriverci dentro:

$ chmod 777 cache/ log/

Ora, importare tutti i file e le cartelle:

$ svn add *

Siccome non sarà mai necessario di eseguire il commit per file delle cartelle cache/ e /log, si possono 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 inserire:

*

Infine, eseguire la prima importazione:

$ svn import -m "prima importazione" .
➥ http://svn.example.com/jobeet/trunk

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 per Jobeet.

ORM

インデックス

Document Index

関連ページリスト

Related Pages

日本語ドキュメント

Japanese Documents

リリース情報
Release Information

Symfony2 に関する情報(公式) Books on symfony