phpDay 2013

Anche quest’anno si svolgerà a Verona il phpDay, evento nazionale di riferimento per PHP, ormai elevato a rango internazionale.
Come sempre, Symfony avrà una (meritata) importante presenza alla conferenza. Ecco tutti i talk in programma a riguardo:

Per il programma completo, rimandiamo al sito ufficiale: http://2013.phpday.it/schedule/

Versioni di Capifony

Capifony, come sapete, è ormai lo standard de facto per il deploy con Symfony. È un bel progetto, mantenuto attivamente, che quindi spesso viene aggiornato. Dal canto suo, anche Capistrano (a cui Capifony si appoggia), riceve vari aggiornamenti. E qui purtroppo arrivano i problemi: più di una volta mi è capitato di trovarmi con un Capifony non funzionante, a causa di stretti requisiti (un po’ troppo stretti, a mio parere) sulle dipendenze.
Prendiamo come esempio le ultime versioni al momento disponibili: aggiornando oggi le gemme di ruby, ho avuto questa brutta sorpresa:

/usr/local/lib/site_ruby/1.8/rubygems/dependency.rb:247:in `to_specs': Could not find capistrano (<= 2.14.1, >= 2.13.5) amongst [capifony-2.2.7, capistrano-2.14.2, capistrano-maintenance-0.0.2, colored-1.2, highline-1.6.15, inifile-2.0.2, net-scp-1.1.0, net-sftp-2.1.1, net-ssh-2.6.5, net-ssh-gateway-1.2.0] (Gem::LoadError)

La versione più recente di Capifony richiede Capistrano non più nuovo di 2.14.1, ma il Capistrano più recente è 2.14.2.
Ecco come ho risolto (i comandi sono stati dati su Ubuntu Linux 12.10, your mileage may vary)

sudo gem uninstall capistrano -v 2.14.2
sudo gem install capistrano -v 2.14.1

L’ultimo comando serve solo se in precedenza è stata fatta una pulizia delle gemme, tramite sudo gem clean. Purtroppo anche questa va fatta, perché spesso le versioni diverse sono in conflitto tra di loro.

Fixture con contenitore di servizi nei test funzionali

A volte può essere utile avere a disposizione il contenitore di servizi nelle fixture usate nei test funzionali. Un caso tipico è l’uso di FOSUserBundle, che mette a disposizione un servizio UserManager per creare utenti, utilizzabile quindi anche per crearli all’interno delle fixture.
Purtroppo la documentazione a riguardo è alquanto avara di informazioni, per cui condivido qui questa soluzione, mostrando un esempio.
Ecco un possibile file di fixture per gli utenti:

<?php
 
namespace Acme\PippoBundle\DataFixtures\ORM;
 
 
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
 
class LoadUserData extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
    private $container;
 
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }
 
    public function load(ObjectManager $manager)
    {
        $userManager = $this->container->get('fos_user.user_manager');
 
        $user1 = $userManager->createUser();
        $user1
            ->setUsername('pippo')
            ->setEmail('pippo@example.org')
            ->setFirstName('Mallo')
            ->setLastName('Di Noce')
            ->setBirthday(new \DateTime('1977-07-07'))
            ->setEnabled(true)
            ->setPlainPassword('mallodinoce')
        ;
        $userManager->updateUser($user1, false);
        $manager->persist($user1);
        $this->addReference('user1', $user1);
 
        $manager->flush();
    }
 
    public function getOrder()
    {
        return 1;
    }
}

Questa fixture si può usare in un test in questo modo:

<?php
 
namespace Acme\PippoBundle\Tests\Controller;
 
use Acme\PippoBundle\DataFixtures\ORM\LoadUserData;
use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;
use Symfony\Bridge\Doctrine\DataFixtures\ContainerAwareLoader as Loader; // il trucco è qui..
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase
 
class DefaultControllerTest extends WebTestCase
{
    public function setUp()
    {
        $kernel = static::createKernel();
        $kernel->boot();
        $container = $kernel->getContainer();
        $loader = new Loader($container);  // ... e qui
        $loader->addFixture(new LoadUserData);
        $purger = new ORMPurger();
        $executor = new ORMExecutor($this->em, $purger);
        $executor->execute($loader->getFixtures());
    } 
 
    public function testIndex()
    {
        $client = static::createClient();
        $crawler = $client->request('GET', '/');
        $this->assertTrue($client->getResponse()->isSuccessful());
    }
}

Rilasciato Symfony 2.2.0beta

Come ampiamente annunciato nella documentazione sul processo di rilascio, la prossima versione di Symfony 2.2 uscirà a fine febbraio prossimo. Oggi intanto ne è uscita la prima beta, mentre una release candidate è prevista per fine mese.
Intanto già si parla di 2.3, la prima LTS! La sua uscita è prevista per fine maggio.
Attenzione anche alla 2.0, perché a fine gennaio scadrà il suo supporto.

SymfonyDay in Italia

Tra un mese esatto, il 5 ottobre 2012, si terrà a Torino il primo evento italiano dedicato completamente a Symfony, il SymfonyDay.
Purtroppo l’evento ha dei posti limitati, nel momento in cui scriviamo ne sono rimasti solamente 7 e probabilmente finiranno in fretta.

Affrettatevi quindi, per non mancare a questo evento imperdibile.
Sul sito del SymfonyDay sono già disponibili tutte le informazioni necessarie, compreso il programma completo.
Ci vediamo a Torino!