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

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 }}

Limiter la longueur d’une chaîne avec TWIG et le filtre truncate

Avec TWIG, il est possible d’appliquer des filtres à nos variables, et des fonctionnalités semblables à la function truncate() utilisée avec PHP. Pour pouvoir utiliser ces filtres, il est nécessaire d’activer certaines extensions TWIG.

L’extension dont nous avons besoin pour limiter la longueur d’une chaîne est l’extension text. Sans avoir ajouté cette extension, vous avez l’erreur suivante:

The filter « truncate » does not exist in …

Pour l’activer, rendez vous dans votre config.yml, et rajoutez dans le service suivant :

//app/config/config.yml
services:
    twig.extension.text:
       class: Twig_Extensions_Extension_Text
       tags:
           - { name: twig.extension }

 

A partir de là, vous pouvez depuis votre template utiliser le filtre Truncate, avec la syntaxe suivante :

{# in twig template #}
{{ myString | truncate(20, false, '') }}
{# cette première utilsation coupe directement la chaîne myString #}
{{ myString | truncate(20, true, '...') }}
{# cette deuxieme utilsation coupe la chaîne myString en rajoutant ' ... ' à la suite #}

Une autre méthode pour couper une chaîne de caractères avec Twig est de faire comme suivant :

{{ uneVideo.titreVideo[:25] }}

C’est assez explicite aussi de cette façon ! Néanmoins, cette méthode ne permet pas de rajouter des points de suspension en fin de chaîne tronquée… mais si vous avez la solution, je veux bien la connaître par curiosité ;) !