Video SymfonyDay 2016

Come regalo per le festività di fine anno, il GrUSP ha iniziato a pubblicare i video completi della conferenza svolta lo scorso settembre, l’edizione 2016 del SymfonyDay.
Ecco l’album: video SymfonyDay 2016 (in via di completamento al momento della scrittura di questo articolo)

Symfony verso il mezzo miliardo di download

Il sito ufficiale Symfony.com ha lanciato un’iniziativa per festeggiare l’imminente traguardo dei 500 milioni di download di Symfony (contando solo composer e non eventuali scaricamenti diretti dell’archivio).
È stato messo online un contatore in tempo reale su symfony.com/500million. Inoltre è stato lanciato un concorso social, per cui twittando una foto con l’hashtag #500million si può vincere abbonamenti premium o simpatici gadget.
Fonte: http://symfony.com/blog/the-road-to-500-million-symfony-downloads

Le novità di Symfony 2.4

Come da roadmap, questo mese uscirà una nuova versione maggiore Symfony2, la 2.4, che sarà un rilascio standard (quindi con supporto di 8 mesi). Una prima grande novità era stata già annunciata da Fabien (vedi articolo). Vedremo qui sotto un piccolo riepilogo, con link ai relativi approfondimenti tratti dal blog ufficiale. Nel frattempo, sono usciti aggiornamenti (quindi versioni minori) sia della 2.2, che ricordiamo sta per andare fuori supporto, che della 2.3, che invece sarà supportato fino a metà 2016 (essendo una LTS).
Ma ecco il riepilogo:

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());
    }
}

VichUploaderBundle, file upload con doctrine

L’ upload di file è una delle necessità più comuni di un’applicazione web. La documentazione ufficiale copre l’argomento in maniera piuttosto chiara, trattando sia l’upload di file generico che quello di file legati ad un’entità doctrine. In particolare quest’ultimo è probabilmente il caso più comune dato che, nella maggioranza dei casi, vorrai avere su database un riferimento al file caricato.

La procedura descritta nel cookbook è assolutamente corretta, ma l’utilizzo del bundle VichUploaderBundle rende il tutto più efficace e risolve, abbastanza bene, anche un paio di problemi. Ecco la mia esperienza con questo bundle.

Continue reading “VichUploaderBundle, file upload con doctrine”