Bientôt la sortie de Symfony3

Symfony2 a été encore plus utilisé que Symfony première version. Symfony2 a même explosé au sein des agences de développement web. Mais les temps changent, et Symfony3 pointe déjà le bout de son nez.

Selon la roadmap de Fabien Potencier, il n’est pas la peine de se faire du sang d’encre pour prévoir la future migration des sites actuellement en Symfony2 vers Symfony3. OUF ! C’est un véritablement, soulagement. Tu le sais, toi qui as peut être déjà fait une migration vers Symfony2 depuis la première version de Symfony… L’équipe de Fabien Potencier a été très maline, et a réussi à mener au fil des versions mineures les développeurs vers une branche stable, à laquelle il ne faudra rajouter qu’une petite marche pour être compatible Symfony3 !

Chez Wanadev, presque toutes nos réalisations sont réalisées avec Symfony, alors nous suivons avec attention la prochaine version Symfony3. Nous travaillons actuellement, autant que possible, en version 2.7 afin d’être prêts pour le jour J. Et il arrive bientôt, ce jour J… En effet, Symfony3 est prévu en novembre 2015 !

hashtag impatient ;) !

blog-trotting_header
composerjson

Les bundles incontournables pour un nouveau projet Symfony2

composerjsonAvec le temps et l’expérience, au fil des projets Symfony2, on se rend compte que plusieurs Bundles reviennent régulièrement. Je dirai même plus qu’on se demande même comment nous ferions sans certains d’entre eux. Au contraire de ça, des Bundles ne nous semblent plus vraiment utiles, voir même gênants, même s’ils paraissent fabuleux aux premiers essais.

Voici une liste des différents Bundles Symfony2 qui me semblent incontournables.

Continue reading

Utiliser les fonctions de date SQL avec doctrine2 et symfony2

Merci à Florent Viel pour m’avoir refilé le tips (c’est un tueur) !

Grâce à SQL, il est possible de manipuler des dates en utilisant les fonction MONTH(), MINUTE(), etc… plus d’info sur les manipulations de dates en SQL.

Cependant, il est parfois utile de pouvoir les utiliser dans doctrine (par exemple comme dans mon cas en travaillant sur Symfony2 (v2.3 à l’heure où j’écris ce billet)). Avant de pouvoir les utiliser facilement comme dans cet exemple :

$qb = $this->createQueryBuilder('p')
            ->select('count(p) as activity, hour(p.created_at) as hour, dayofweek(p.created_at) as journey')
            ->groupBy('hour, journey');

Il est nécessaire de faire un petit prérequis qui indiquera à doctrine comment utiliser ces fonctions jusqu’à lors inconnues pour lui.

Dans un dossier DQL dans mon bundle (par exemple), créer un fichier Month.php qui renseigne comment parser un format date

<?php

namespace YourApp\YourBundle\DQL;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;

/**
 * DateFunction ::= "HOUR" "(" ArithmeticPrimary ")"
 */
class Month extends FunctionNode
{
    public $dateExpression;

    public function parse(Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->dateExpression = $parser->ArithmeticPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(SqlWalker $sqlWalker)
    {
        return 'MONTH(' .
            $this->dateExpression->dispatch($sqlWalker) .
        ')';
    }
}

Ensuite, dans le fichier de config config.yml de votre application, rajoutez les différentes fonctions que vous souhaitez utiliser :

doctrine:
    orm:
        entity_managers:
                dql:
                    datetime_functions:
                        date: YourApp\YourBundle\DQL\Date
                        hour: YourApp\YourBundle\DQL\Hour
                        month: YourApp\YourBundle\DQL\Month

A partir de là, vous pourrez utiliser vos fonctions de manipulation de dates comme en SQL.

Régler l’erreur ‘Unknown Entity namespace alias […]. 500 Internal Server Error – ORMException’ [Symfony2]

J’ai passé pas mal de temps sur cette erreur. Je me trouvais dans le controller profileController surcharge du FOSUserBundle. Je souhaitais pouvoir récupérer un utilisateur autre que celui qui est connecté grâce à un paramètre d’id.

Par défaut j’ai utilisé :

//dans mon action
$repositoryUser = $this->getDoctrine()
            ->getEntityManager()
            ->getRepository('MonsiteUserBundle:User');

$user = $repositoryUser->findOneById($id);

Et finalement, j’avais l’erreur Unknown Entity namespace alias […]. 500 Internal Server Error – ORMException’ .

La solution était de ne pas indiquer le namespace global du projet, comme ci-dessous.

//dans mon action
$repositoryUser = $this->getDoctrine()
            ->getEntityManager()
            ->getRepository('UserBundle:User');

$user = $repositoryUser->findOneById($id);

Je ne sais pas pourquoi tout agit comme ça, mais en cas ça a résolu mon problème, si quelqu’un à l’explication du pourquoi du comment, je suis preneur.

note : pour utiliser GetDoctrine dans un controller de FOSUserBundle