Caution: You are browsing the legacy 1.x part of this website.
This version of symfony is not maintained anymore. If some of your projects still use this version, consider upgrading.

Master Symfony fundamentals

Be trained by SensioLabs experts (2 to 6 day sessions -- French or English).
training.sensiolabs.com

Discover SensioLabs' Professional Business Solutions

Peruse our complete Symfony & PHP solutions catalog for your web development needs.
sensiolabs.com
Blackfire Profiler Fire up your PHP Apps Performance

PHP Project Quality Done Right
Jobeet

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

verifica configurazione

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.

note

Se non sapete nulla a proposito di XSS o CSRF, prendetevi il tempo per sapere qualcosa in più su queste vulnerabilità della sicurezza.

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:

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

Un'eccezione nell'ambiente di produzione

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.

sidebar

Configurare un nome a dominio dedicato per Jobeet

Se avete i privilegi amministrativi sulla macchina su cui lavorate, è meglio impostare dei virtual host piuttosto che aggiungere una nuova porta ogni volta che iniziate un nuovo progetto. Invece che selezionare una porta ed aggiungere una direttiva di tipo Listen, scegliete un nome a dominio ed aggiungete una direttiva di tipo ServerName:

# Questa è la configurazione per Jobeet
<VirtualHost 127.0.0.1:80>
  ServerName jobeet.localhost
  <!-- stessa configurazione di prima -->
</VirtualHost>

Il nome a dominio jobeet.localhost, usato nella configurazione di Apache, deve essere dichiarato localmente. Se utilizzate un sistema Linux, questo va fatto nel file /etc/hosts. Se usate Windows XP, questo file è posizionato nella cartella C:\WINDOWS\system32\drivers\etc\.

Aggiungi la seguente riga:

127.0.0.1         jobeet.localhost

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.

Congratulazioni

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.

web debug toolbar

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/