2015-02-24 2 views
1

J'ai un contrôleur dans une application Symfony 2.1, appelons-le FooController dans le BarBundle. Ce contrôleur a beaucoup d'actions fooAction, barAction, bazAction et quelques autres.Ajouter des données pour retourner toutes les actions dans un contrôleur Symfony

Tous ont quelque chose en commun. Ils affichent dans certaines parties les mêmes données dans la vue, pas dans tous, donc je ne peux pas utiliser une seule action avec le type comme paramètre. Je voudrais ajouter les données qui doivent être transmises à la vue dans un endroit central, sinon, ce ne serait pas sec.

Bad (à mon avis):

public function fooAction() { 
    // ... 
    return $this->render('BarBundle:Foo:foo.html.twig', array('foo' => 'Foo Data', 'data' => $this->getTheDataThatIsNeededInEveryAction())); 
} 
public function barAction() { 
    // ... 
    return $this->render('BarBundle:Foo:bar.html.twig', array('bar' => 'Bar Data', 'data' => $this->getTheDataThatIsNeededInEveryAction())); 
} 
public function bazAction() { 
    // ... 
    return $this->render('BarBundle:Foo:baz.html.twig', array('baz' => 'Baz Data', 'data' => $this->getTheDataThatIsNeededInEveryAction())); 
} 

Ce que je me demande maintenant, est, ce serait la façon "bonne"? Y a-t-il une fonction finished dans le contrôleur parent qui est appelée juste avant d'envoyer les données à la vue, où je pourrais ajouter ces données à l'objet réponse?

Une autre possibilité serait, pour créer un écouteur d'événement, mais je pense que ce serait un gaspillage de ressources.

Une troisième option serait d'utiliser la fonction render comme {% render url('latest_articles', { 'max': 3 }) %} Je sais que de nos jours il est {{ render(controller(..)) }} mais je suis coincé avec Symfony 2.1 avec ce projet.

Répondre

2

Une option est de créer votre propre contrôleur de base, et ont tout autre contrôleur prolonger. Votre contrôleur de base serait passer outre la fonction render de la classe Controller du framework symfony

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
class BaseController extends Controller 
{ 
    // override render method 
    protected function render($template, $data) 
    { 
     $commonData = [];// get data from wherever you need 
     parent::render($template, $data + $commonData); 
    } 
} 

Ensuite, dans vos autres contrôleurs

class MyAnotherController extends BaseController 
{ 
    public function fooAction() { 
    // ... 
    return $this->render('BarBundle:Foo:foo.html.twig', array('foo' => 'Foo Data')); 
    } 
} 
+0

Nice, je n'y ai pas encore pensé. Je vais essayer. – wawa

0

Une des options

public function commonAction($type) { 
    // ... 
    return $this->render('BarBundle:Foo:'.$type.'.html.twig', array('data' => $this->getTheDataThatIsNeededInEveryAction())); 
} 

$type serait être bar, foo ou baz

+0

Malheureusement, les fonctions ne sont pas aussi simple que cela, ils doivent renvoyer des données différentes pour chaque action, je vais ajouter cela à la question. – wawa