Symfony 2 : Che cos’è un Bundle e Come si crea un Bundle

0
2199

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.