Symfony Live 2012

sflive È stato appena annunciato su twitter che l’edizione 2012 della nota conferenza Symfony Live si terrà un po’ più tardi, a giugno, esattamente il 7 e l’8, con la consueta giornata di workshop il giorno precedente e un hacking day il giorno successivo. Speriamo di vedere presto aperto il call for paper!

Utilizzare le Estensioni di Doctrine in progetti symfony2

Doctrine prevede un set di eventi che permettono di modificarne ed estenderne il comportamento. Tramite l’utilizzo di questi eventi è possibile implementare nuove funzionalità non previste dall’ ORM. Sfruttando questa potenzialità è stato creato un set di estensioni per mettere a disposizione degli sviluppatori alcuni comportamenti di uso comune. L’integrazione all’interno di symfony2 è facilitata dal bundle StofDoctrineExtensionsBundle.

Continue reading this post »

Abilitare estensioni aggiuntive per Twig

Twig è il template engine integrato in Symfony2. Nella Standard Edition oltre al core di Twig è presente anche il repository delle estensioni. Le funzionalità di queste estensioni non sono disponibili automaticamente, è richiesto all’utente di attivarle manualmente, vediamo come. Continue reading this post »

Un piccolo problema con Symfony2 e PHPUnit 3.6

Se usate Symfony2 (al momento fino alla versione 2.0.5) e aggiornate PHPUnit alla recente versione 3.6, probabilmente avrete delle eccezioni in test che fino a un attimo prima erano verdi.
Il bug è noto e spiegato in dettaglio sul repo di PHPUnit, in cui si trova anche un semplice, ma efficace, rimedio, in attesa che si mettano d’accordo su chi deve fixare cosa ;)

Usare Symfony2 con subversion

Sappiamo che Symfony2 predilige l’utilizzo di git come sistema di versionamento. Tuttavia, potrebbero esserci tutta una serie di ragioni per cui un progetto abbia bisogno di subversion: la stessa documentazione ufficiale ne fa un accenno, purtroppo senza addentrarsi nei dettagli.
Ecco qui cosa fare per avere un progetto Symfony2 funzionante con svn. Diamo per scontato di trovarci un una cartella in cui è stato fatto un checkout di un repository e in cui la cartella vendor di Symfony2 non sia presente (per esempio, perché il repository contiene uno scheletro di progetto simile a quello della Standard Edition senza venditori).
La prima cosa da fare è aggiungere i vari bundle e le altre dipendenza in externals:

mkdir vendor
svn pe svn:externals vendor

Nella finestra dell’editor, inserire le seguenti righe:

symfony              http://svn.github.com/symfony/symfony.git
twig                 http://svn.github.com/fabpot/Twig.git
monolog              http://svn.github.com/Seldaek/monolog.git
doctrine-common      http://svn.github.com/doctrine/common.git
doctrine-dbal        http://svn.github.com/doctrine/dbal.git
doctrine             http://svn.github.com/doctrine/doctrine2.git
swiftmailer          http://svn.github.com/swiftmailer/swiftmailer.git
assetic              http://svn.github.com/kriswallsmith/assetic.git
twig-extensions      http://svn.github.com/fabpot/Twig-extensions.git
metadata             http://svn.github.com/schmittjoh/metadata.git
 
doctrine-extensions  http://svn.github.com/l3pp4rd/DoctrineExtensions.git
 
bundles/Stof/DoctrineExtensionsBundle       http://svn.github.com/stof/StofDoctrineExtensionsBundle.git
 
bundles/Sensio/Bundle/FrameworkExtraBundle  http://svn.github.com/sensio/SensioFrameworkExtraBundle.git
bundles/Sensio/Bundle/DistributionBundle    http://svn.github.com/sensio/SensioDistributionBundle.git
bundles/Sensio/Bundle/GeneratorBundle       http://svn.github.com/sensio/SensioGeneratorBundle.git
bundles/JMS/SecurityExtraBundle             http://svn.github.com/schmittjoh/JMSSecurityExtraBundle.git
 
cg-library                                  http://svn.github.com/schmittjoh/cg-library.git
bundles/JMS/AopBundle                       http://svn.github.com/schmittjoh/JMSAopBundle.git
 
symfony/src/Symfony/Bundle/AsseticBundle    http://svn.github.com/symfony/AsseticBundle.git

Si noti che sono stati aggiunti, oltre ai bundle di base, alcuni altri bundle utili.
Il problema di questo approccio è che github, almeno attualmente, non supporta il checkout di tag o branch tramite svn. Per questo le versioni dei vari venditori importate saranno quelle dei rispettivi master, quindi le versioni in sviluppo. Se quindi si riscontrano errori o eccezioni dovuti per esempio a metodi mancanti, si verifichi che il file app/bootstrap.php.cache contenga tutto ciò che è necessario. Ovviamente, va adattato anche il file relativo all’autoload:

// app/autoload.php
$loader->registerNamespaces(array(
    'Symfony'          => array(__DIR__.'/../vendor/symfony/src', __DIR__.'/../vendor/bundles'),
    'Sensio'           => __DIR__.'/../vendor/bundles',
    'JMS'              => __DIR__.'/../vendor/bundles',
    'CG'               => __DIR__.'/../vendor/cg-library/src',
    'Doctrine\\Common' => __DIR__.'/../vendor/doctrine-common/lib',
    'Doctrine\\DBAL'   => __DIR__.'/../vendor/doctrine-dbal/lib',
    'Doctrine'         => __DIR__.'/../vendor/doctrine/lib',
    'Monolog'          => __DIR__.'/../vendor/monolog/src',
    'Assetic'          => __DIR__.'/../vendor/assetic/src',
    'Metadata'         => __DIR__.'/../vendor/metadata/src',
    'Gedmo'            => __DIR__.'/../vendor/doctrine-extensions/lib',
    'Stof'             => __DIR__.'/../vendor/bundles',
));

e anche quello relativo all’attivazione dei bundle:

// 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(),
        new JMS\AopBundle\JMSAopBundle(),
        new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
        new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
    );
 
    if (in_array($this->getEnvironment(), array('dev', 'test'))) {
        $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
        $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
    }
 
    return $bundles;
}

Aggiornamento: si può adattare facilmente app/bootstrap.php.cache con il comando

php ./vendor/bundles/Sensio/Bundle/DistributionBundle/Resources/bin/build_bootstrap.php

La documentazione italiana di Symfony2

Tradizionalmente, la nostra comunità è sempre stata molto attiva nella traduzione della documentazione. Questo ci ha permesso di avere a disposizione tutti i documenti relativi a symfony 1.x tradotta nella nostra lingua.
Ora è arrivato il momento di lavorare sulla corposa documentazione di Symfony2.
Le modalità, come forse saprete, sono molto cambiate rispetto al passato, soprattutto per la decisione di non ospitare sul sito ufficiale nessuna traduzione che non sia completa e aggiornata. Per questo abbiamo deciso di ospitare temporaneamente la versione nostrana qui su symfony.it, precisamente su docs.symfony.it, in modo da renderla immediatamente disponibile a tutti.
Qualunque contribuito è ben accetto: la gestione del team dei traduttori è sul nostro gruppo Google, in un apposito topic.

Symfony 2.0, finalmente!

Dopo un parto veramente travagliato, è finalmente nato oggi Symfony 2.0!
L’annuncio è stato dato sul blog ufficiale, al quale rimandiamo per i numerosi dettagli.
Ora sarebbe quasi il caso di riprendere la traduzione in Italiano del manuale, che era stata volenterosamente avviata alcuni mesi fa e poi purtroppo abbandonata. Ogni contributo è ben accetto.

Richiamare il “nonno” di una classe

Capita spesso in symfony, in cui l’ereditarietà è usata pesantemente, di dover sovrascrivere un metodo.
A volte purtroppo questo metodo è a sua volta un override di un metodo della propria classe padre, come nel seguente esempio:

1
2
3
4
5
6
// funzione originale
public function pippo()
{
  parent:pippo()
  // ecc. ecc.
}

Se siamo in un caso come questo e ci serve sovrascrivere la funzione pippo(), non possiamo ricorrere a parent::, perché richiamerebbe appunto la funzione che vogliamo aggirare. La soluzione è tanto semplice quanto efficace:

1
2
3
4
5
6
// nostra funzione di override
public function pippo()
{
  call_user_func(array(get_parent_class(get_parent_class($this)), 'pippo'));
  // ecc. ecc.
}

In questo modo possiamo richiamare direttamente il nonno della nostra classe, invece del padre :)

Piccoli aggiornamenti per symfony 1.4

Oggi è uscito un rilascio minore del ramo 1.4, la 1.4.12, con fix di piccoli bug. Come sempre, l’elenco dettagliato è nel CHANGELOG.

La prima RC di Symfony2

È stata annunciata ieri l’uscita della prima release candidate del mai tanto atteso Symfony2.
Una delle maggiori novità, che sicuramente farà contenti gli utenti del vecchio symfony, è l’aggiunta di un sistema di generatori (di cui è disponibile uno screencast).
Quasi in contemporanea, è stata annunciata anche la disponibilità di un canale PEAR per Symfony2.