Nella precedente lezione abbiamo visto come è la struttura di un applicazione realizzata con symfony, oggi iniziamo a vedere come creare il nostro Bundle cioè la struttura che conterrà il nostro progetto.
Un bundle non è nulla di più di una cartella che ospita ogni cosa correlata a una specifica caratteristica, incluse classi PHP, configurazioni e anche fogli di stile e file JavaScript.
Ma cos’è un bundle esattamente ?
Un bundle è simile a un plugin in altri software, ma anche meglio.
La differenza fondamentale è che tutto è un bundle in Symfony2, incluse le funzionalità fondamentali del framework o il codice scritto per la propria applicazione.
Questo fornisce la flessibilità di usare caratteristiche già pronte impacchettate in bundle di terze parti o di distribuire i propri bundle.
Rende facile scegliere quali caratteristiche abilitare nella propria applicazione per ottimizzarla nel modo preferito.
Un bundle è semplicemente un insieme strutturato di file dentro una cartella, che implementa una singola caratteristica. Si potrebbe creare un BlogBundle, un ForumBundle o un bundle per la gestione degli utenti (molti di questi già esistono come bundle open source).
Ogni cartella contiene tutto ciò che è relativo a quella caratteristica, inclusi file PHP, template, fogli di stile, JavaScript, test e tutto il resto. Ogni aspetto di una caratteristica esiste in un bundle e ogni caratteristica risiede in un bundle.
Un’applicazione è composta di bundle, come definito nel metodo registerBundles() della classe AppKernel:
// app/AppKernel.php public function registerBundles() { $bundles = array( new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), new Symfony\Bundle\SecurityBundle\SecurityBundle(), new Symfony\Bundle\TwigBundle\TwigBundle(), new Symfony\Bundle\MonologBundle\MonologBundle(), new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), new Symfony\Bundle\DoctrineBundle\DoctrineBundle(), new Symfony\Bundle\AsseticBundle\AsseticBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), );
if (in_array($this->getEnvironment(), array(‘dev’, ‘test’))) { $bundles[] = new Acme\DemoBundle\AcmeDemoBundle(); $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); } return $bundles; }
Col metodo registerBundles(), si ha il controllo totale su quali bundle siano usati dalla propria applicazione (inclusi i bundle del nucleo di Symfony).
Un bundle può stare ovunque, purché possa essere auto-caricato (tramite l’autoloader configurato in app/autoload.php).
Per creare un Bundle esisto 2 modi quello manuale, e uno che realizza la nostra struttura tutto in automatico, vediamo la creazione automatica, per iniziare dobbiamo lanciare un comando:
URL_PERCORSO\Symfony_demo> php app/console generate:bundle –namespace=Demo/BlogBundle –format=yml
Una volta terminata la creazione guidata ( Per comodità dare sempre invio ), avra creato la nuova struttura per testare se tutto è andato OK lanciamo la seguente URL:
http://localhost/NomeApplicazione/web/app_dev.php/Percorso_Specificato_Nel_File_Delle_Rotte
Ma anche creare un bundle a mano è molto facile.
Per dimostrare quanto è semplice il sistema dei bundle, creiamo un nuovo bundle, chiamato NotizieTestBundle, e abilitiamolo.
La parte Demo è solo un nome fittizio, che andrebbe sostituito da un nome di “venditore” che rappresenti la propria organizzazione (p.e. ABCTestBundle per un’azienda chiamata ABC).
Iniziamo creando una cartella src/Demo/NotizieBundle/ e aggiungendo un nuovo file chiamato DemoNotizieBundle.php:
// src/Demo/NotizieBundle/DemoNotizieBundle.php namespace Demo\NotizieBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; class DemoNotizieBundle extends Bundle { }
Il nome DemoNotizieBundle segue le convenzioni sui nomi dei bundle. Si potrebbe anche scegliere di accorciare il nome del bundle semplicemente a NotizieBundle, chiamando la classe NotizieBundle (e chiamando il file NotizieBundle.php).
Questa classe vuota è l’unico pezzo necessario a creare un nuovo bundle. Sebbene solitamente vuota, questa classe è potente e può essere usata per personalizzare il comportamento del bundle.
Ora che abbiamo creato il bundle, abilitiamolo tramite la classe AppKernel:
// app/AppKernel.php public function registerBundles() { $bundles = array( …, // register your bundles new Demo\NotizieBundle\DemoNotizieBundle(), ); // … return $bundles; }
Sebbene non faccia ancora nulla, DemoNotizieBundle è ora pronto per essere usato. Symfony fornisce anche un’interfaccia a linea di comando per generare uno scheletro di base per un bundle:
$ php app/console generate:bundle –namespace=Demo/NotizieBundle
Lo scheletro del bundle è generato con controllore, template e rotte, tutti personalizzabili.
Ogni volta che si crea un nuovo bundle o che si usa un bundle di terze parti, assicurarsi sempre che il bundle sia abilitato in registerBundles().
Se si usa il comando generate:bundle, l’abilitazione è automatica.