Symfony2: Changer le rendu de la vue avec un écouteur
Je tiens à rendre des points de vue différents dans un contexte différent dans mon projet Symfony2.
Je suis en utilisant de multiples voies pour les mêmes actions, et je voudrais afficher une autre page (vue), mais avec le même contrôleur.
Par exemple, j'ai:
@Route("/articles/show", name="articles_show")
@Route("/mobile/articles/show", name="mobile_articles_show")
Les deux voies utilisez la même action : contrôleur d'articles articlescontroller:showAction(), mais doit rendre des 2 différents modèles (pour les utilisateurs mobiles et les habitués).
show.html.twig
mobile.show.html.twig
Je ne veux pas utiliser une instruction if ou que ce soit dans mon contrôleur, j'ai donc créé un "listener" (similaire à un preExecute fonction)
Voici une partie ou mon config.yml qui définit mon auditeur
services:
controller.pre_execute_listener:
class: MyProject\MyBundle\Listener\ControllerListener
arguments: ["@security.context", "@doctrine", "@router", "@session"]
tags:- { name: kernel.event_listener, event: kernel.controller, method: preExecute }
Je pensais faire quelque chose comme ça dans l'écouteur preExecute fonction:
if(substr($route,0,7) == 'mobile_'){
$view = 'mobile.'.$view;
}
Malheureusement je ne peux pas trouver un moyen d'obtenir $view ou de mise à jour de l'affichage "à la volée", juste avant le rendu.
J'espère que ma question est assez claire, merci d'avance, toute idée est la bienvenue 🙂
J.
OriginalL'auteur Jonathan Hell | 2012-08-20
Vous devez vous connecter pour publier un commentaire.
Ici est la solution:
Première fois que j'ai écouter noyau.vue, pas de noyau.le contrôleur.
Puis-je utiliser le "@template" service (Merci Marko Jovanovic pour l'astuce)
Voici donc ma nouvelle config.yml:
Voici enfin mon écouteur preExecute fonction
Espérons que cette aide!
J.
OriginalL'auteur Jonathan Hell
Noter: La solution retenue ne fait pas travailler si vous retourner directement une
Response
-objet (par exemple, lorsque vous appelez$this->render()
), parce que lekernel.view
événement n'est pas déclenché dans ce cas:Je ne pouvais pas travailler sur un moyen de contourner cela, mais il a trouvé une autre solution intéressante pour le même problème:
Il vous suffit d'étendre twig du moteur de rendu comme le ZenstruckMobileBundle ne ou écrire votre propre fichier de localisateur comme le LiipThemeBundle.
[edit:] Sinon vous pouvez aussi remplacer le
TemplateNameParser
.OriginalL'auteur Iris Schaffer
Vous pouvez ajouter "@template" service comme argument pour le contrôleur.pre_execute_listener.
Oh désolé, j'ai simplement supposé que @template contient un nom d'un courant (stupide de moi) :(. De toute façon, je vois que vous avez résolu le problème, de sorte que vous pouvez poster la réponse vous-même et de l'accepter. P. S. Si vous avez besoin d'un moyen alternatif de l'annulation de modèles voir ma réponse sur ce sujet stackoverflow.com/questions/8257676/...
OriginalL'auteur Marko Jovanović
Il semble que votre appareil de détection est faite avant de venir à votre itinéraire, de sorte que je parie que vous vous attendez à ce que le mobile de l'utilisateur va utiliser le mobile routes grâce à une détection avant la demande, ce qui semble être douloureuse à traiter dans tous les modèles et l'url de génération.
Peut-être mieux de détecter l'appareil soit avant ou plus tard (grâce à Categorizr ou quelques belles configuration d'apache), mais en ne s'appuyant pas sur l'itinéraire pour les mobiles de détection.
Une intégration de Categorizr avec de cette façon de l'appel de modèles de rendu pourrait être sympa.
Puis à l'aide de un joli bundle pour l'utilisation du droit templates/thèmes ou à l'aide de l'un qui permet plus de fonctions génériques
OriginalL'auteur Jean-Christophe Meillaud