Résoudre ‘Fatal error: Call to undefined method UserBundle\ Controller\ProfileController::getDoctrine()’ [Symfony2]

Pour résoudre l’erreur :

Il suffit d’ajouter dans le controller en question la fonction suivante :

/**
* Shortcut to return the Doctrine Registry service.
*
* @return Registry
*
* @throws \LogicException If DoctrineBundle is not available
*/
 public function getDoctrine()
 {
    if (!$this->container->has('doctrine')) {
            throw new \LogicException('The DoctrineBundle is not registered in your application.');
 }

    return $this->container->get('doctrine');
 }

ainsi que les Use en haut du controller adéquats.

 

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

Chefs de projets, choyez votre équipe !

Souvent, dans une entreprise, le(s) chef(s) de projets (ou le(s) responsable(s)) s’occupe(nt) de faire les commandes en fonction des besoins matériels de leur(s) équipe(s). Ecran, souris, ordinateur portable, dans quelle gamme investir pour ses développeurs/graphistes/employés.

Acheter du matériel haut de gamme fait peur, les tarifs peuvent s’élever rapidement. Une bonne tour, un dual screen 23″, une tablette graphique, tout ça a un prix. Mais alors, mettre une grosse somme dans ces outils de travail : est-ce dangereux ?

Pour analyser ça, prenons un cas très simple. Vous avez un développeur pour qui vous avez à choisir et commander du matériel :

Admettons que votre développeur gagne 1500€ net/mois. Il coûte approximativement 3000€ / mois à l’entreprise qui l’emploie. Pour 35 heures de travail / semaine,  on va dire environ 20 jours travaillés par mois (à 7 h/jour). Par conséquent, un développeur coûte à son employeur 150 €/jour, soit environ 21.50 €/heure.

Regardons maintenant à combien revient le matériel de ce même développeur. Admettons que nous lui choisissions une machine puissante, un dual screen ainsi que ses périphériques. Faisons une approximation sur le budget alloué autour des 2000 €, ce qui est déjà élevé avec le prix des composants qui diminue, même pour une très bonne configuration, ou en tout cas très largement suffisante. Au bout de combien de temps souhaitons nous renouveler cet ensemble ? Soyons grand seigneur, nous décidons de renouveler l’ensemble chaque année. Récapitulatif : une très bonne machine, renouvelée souvent, c’est une boite sympa.

Maintenant, calculons. Admettons que cette machine est utilisée uniquement 7 h/jour, par cet employé : la machine est utilisée 240 jours/an, soit 1680 h/an de travail. Cette machine coûte 2000€ en commerce, elle revient donc à l’achat à 1600€ environ car la TVA est déduite des impôts par la suite. Notre ensemble informatique a donc un coût/horaire de 1600/1680 = 0.95 €/heure.

Comparons désormais : notre employé coûte 21,50 €/heure alors que sa machine 0.95 €/h : une bricole.

Allons plus loin, brièvement : qu’en est la productivité gagnée grâce au bon fonctionnement d’une machine de travail ? Augmentée. L’humeur au bureau quand on a du bon matos ? Augmentée (et ouais faut l’avouer quand on reçoit du nouveau matos, c’est un peu noël au bureau !). Aussi, les ordinateurs sont souvent utilisés entre midi et deux, en déplacement (en weekend aussi parfois même), 7 h/jour de travail/utilisation est donc une nouvelle fois une donnée tirée de la fourchette basse.

De plus, très brièvement car les comptables sauront mieux l’expliquer que moi, mais un investissement (de plus de 500€) qui perd de la valeur, peut être amorti en réduction d’impôts : Si un ordinateur de 1000€ perd sa valeur à hauteur de 10 €/mois, une réduction d’impôt de 120€ sera alors établie sur le bilan annuel [Rectif :  il s’agit en fait d’une charge de 120 € déduit du résultat soumit à l’impôt (CF commentaires)]. (en plus, la perte de valeur pour de l’informatique est souvent plus élevée que mon exemple, et une machine est utilisée en moyenne plus d’un an).

Bref : il est difficile de sortir la carte bancaire pour équiper son équipe, j’en conviens. Mais après analyse, finalement, les avantages en sont multiples. Conclusion ? Selon moi, si vous avez le choix : faites plaisir à votre équipe, prenez lui de belles bécanes.

Il s’agit de mon analyse personnelle, peut être que je me trompe mais je serai ravi d’entendre le raisonnement d’entrepreneur, responsable informatique ou toute personne qui pourra me (nous?) renseigner d’avantage.

 

Faire un redirect avec une ancre avec Symfony2

La méthode pour réaliser un redirect vers une page en insérant une ancre dans une action n’est pas évente, voilà la solution que j’ai utilisé :

// On redirige ici vers la page d'un événement avec une ancre
return $this->redirect($this->generateUrl('evenement_show',array( 'id' => $id)) . '#monAncre');

Puis, dans mon template twig, comme d’habitude :

<div id="monAncre">

</div>

 

Faire un include avec Symfony2 et Twig

Avec Symfony 1.4, il était possible de faire 2 sortes d’include différents : le partial et le component. La différence était qu’un partial permettait une include assez classique, en revanche le component permettait d’avoir des actions propres.

Sur Symfony2, et avec TWIG, les deux méthodes sont conservées, même si celles-ci ne portent plus les mêmes noms officiels.

Pour faire un include classique sous Symfony2, de type Partial, on utilise la syntaxe suivante :

{% include "MyBundle:Controller:myTemplate.html.twig" %}

Notez que si vous voulez inclure un template présent dans app/ressources/views, vous n’êtes pas dans un Bundle, et n’avez pas de controller attitré, la bonne syntaxe serait alors

{% include "::myTemplate.html.twig" %}

Dans d’autres cas, vous aurez besoin de faire des traitements propres à ces templates, il vous faudrait donc un controller et une action propre à ce template. L’appel de l’inclusion se fait alors d’une autre manière: avec render.

{# dans mon template twig #}
{% render "MyAppMyBundle:myController:myTemplate" %}

{# pour prendre un exemple :#}
{% render "MonsiteDiscussionBundle:Blog:listeDeMesMessages" %}

(A noter une différence avec l’inclusion classique faite avec ‘include’, cela marche en ne mettant pas l’extension de fichier .html.htwig après le nom du template.)

Le controller utilisé est donc :

//MyApp\MyBundle\Controller;

public function listeDeMesMessagesAction()
{
          //mon traitement
          $maVar = 'lorem ipsum';

         return $this->container->get('templating')->renderResponse('MonsiteDiscussionBundle:Blog:listeDeMesMessages.html.twig', array(
           'maVar' => $maVar
        ));
}

Dans votre template TWIG, vous pouvez donc désormais appeler votre variable et en faire ce que vous voulez, comme par exemple l’afficher avec :

{{ maVar }}