mercoledì 23 marzo 2011

Symfony2, installare un bundle

Penso possa essere utile, anche solo come promemoria, indicare i passi per installare un bundle nella propria applicazione utilizzando come esempio FooAppsHelloBundle già presentato negli articoli precedenti. Presupponendo di avere già installato e configurato Symfony Standard Edition, la prima cosa da fare è scaricare il codice sorgente. Ci sono due modi per farlo: se si ha git installato basta posizionarsi nella cartella del proprio progetto ed usare questo comando

git clone git://github.com/mgiagnoni/HelloBundle.git src/FooApps/HelloBundle

Git creerà la cartella src/FooApps/HelloBundle e vi copierà il contenuto del repository.

Se no dalla pagina principale del bundle su GitHub con il pulsante Downloads scarichiamo un archivio compresso del sorgente, creiamo la cartella src/FooApps nel nostro progetto e ci decomprimiamo l'archivio: sarà creata una cartella mgiagnoni-HelloBundle-7cc65167 (la parte finale cambia perché è l'hash dell'ultimo commit) che va rinominata in HelloBundle.

Ci si potrebbe chiedere la ragione di queste due cartelle nidificate (FooApps/HelloBundle). Symfony utilizza un sistema standard per l'autoloading delle classi che richiede che il percorso relativo di un file contenente la dichiarazione di una classe sia ricavabile dal nome qualificato (che include cioè il namespace) della classe stessa (maggiori dettagli per chi è interessato).

Nome qualificato della classe del nostro bundle: FooApps\HelloBundle\FooAppsHelloBundle Percorso relativo del file: FooApps/HelloBundle/FooAppsHelloBundle.php

Possiamo facilmente verificare che anche il bundle di esempio AcmeDemoBundle installato con Symfony Standard Edition è organizzato nello stesso modo.

Chiaramente a questo punto ci deve essere un sistema per far sapere alla funzione di autoload il percorso assoluto della cartella che corrisponde al namespace di primo livello (nome del vendor, FooApps nel nostro esempio). Questo si fa registrando il namespace nel file app/autoload.php

// app/autoload.php

$loader->registerNamespaces(array(
    /* ... */
    'FooApps' => __DIR__.'/../src',
);

L'operazione è necessaria ogni volta che si crea un nuovo vendor. Se avessi creato un AcmeHelloBundle sfruttando il vendor del bundle dimostrativo mi sarei risparmiato questo passaggio, così come a questo punto me lo risparmierei se creassi all'interno dello stesso progetto altri bundle sotto il vendor FooApps.

Se si apre il file si noterà nella parte che sopra ho omesso la registrazione di una serie di namespace del framework e di altre componenti. Modificando i percorsi predefiniti delle cartelle dove vengono cercate le classi aventi un determinato namespace di primo livello, sarà possibile ad esempio creare una installazione di Symfony condivisa tra più progetti.

Va poi registrato il bundle

// app/AppKernel.php

public function registerBundles()
{
    return array(
        /* ... */
        new FooApps\HelloBundle\FooAppsHelloBundle(),
    );
}

Il bundle definisce delle rotte che vanno importate nella configurazione del progetto.

# app/config/routing.yml

fooapps_hello:
    resource: "@FooAppsHelloBundle/Resources/config/routing.yml"
    prefix: /hello_friend

Il bundle utilizza Doctrine per cui deve essere inserito nel parametro mappings della configurazione dell'orm (rimando maggiori dettagli su questo ad un'altra volta).

# app/config/config.yml

# ...
doctrine:
        # ...
    orm:
        # ...
        default_entity_manager: default
        entity_managers:
            default:
                mappings:
                    # ...
                    FooAppsHelloBundle: ~

Infine bisogna creare database e tabella dove saranno salvati gli oggetti Friend. Dalla cartella del progetto si esegue

$ php app/console doctrine:database:create
$ php app/console doctrine:schema:create

Questi due comandi richiedono che si sia eseguita la procedura di configurazione di Symfony Standard inserendo nome database, nome utente database e password (si può anche editare direttamente il file app/config/parameters.ini).

Come si vede c'è un po' di lavoro manuale, ma è possibile che prima o poi sia creato qualcosa che automatizzi almeno in parte la procedura.

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.