2017-09-25 5 views
0

Comment spécifier un groupe de contrôleurs (par exemple, tous les contrôleurs d'une section admin) et affecter une variable ou un service accessible dans tous les modèles rendus par ces contrôleurs? Un équivalent dans Laravel serait de spécifier différents middleware pour différents groupes de routes.Comment passer une variable à des modèles pour plusieurs contrôleurs dans Symfony 3?

Je ne cherche pas ces réponses:

  1. variables globales - serait injecté inutilement la variable/services à certains des contrôleurs

  2. Embedding (par exemple les contrôleurs frontaux.) autres contrôleurs dans les modèles - une solution de contournement lente, prolixe et répétitive.

+0

Pouvez-vous montrer votre code? –

+1

Les contrôleurs Symfony renvoient généralement la version de réponse d'un modèle afin qu'il n'y ait pas d'espace pour le middleware. Généralement, lorsqu'un contrôleur Symfony renvoie une réponse, il s'agit d'une chaîne complètement analysée. Si vous voulez être capable de le gérer après le contrôleur, vous devrez retourner un ensemble de paramètres avec quelque chose pour identifier le modèle, puis configurer un écouteur 'Kernel :: Response' pour gérer les paramètres supplémentaires et la création réelle de la réponse objet. – qooplmao

+1

Deux options que je peux penser, et vous avez essentiellement dit les deux 1) Service - avoir une fonction pour obtenir la variable si l'utilisateur a l'autorisation, ou la demande est à la bonne url/contrôleur etc 2 Middleware - utilisez les écouteurs d'événement pour définir la variable sur les bonnes requêtes. –

Répondre

1

Pour spécifier des contrôleurs que vous souhaitez passer un param supplémentaire, nous allons faire ses outils comme une interface de AdminInterface.Then passer params à voir, il y a plusieurs façons:

1/auditeur à noyau .view:

public function onKernelView(GetResponseForControllerResultEvent $event) 
    { 
     $result = $event->getControllerResult(); 

     if (!$result instanceof AdminInterface || !isset($result['template']) || !isset($result['data'])) { 
      return; 
     } 

     $data = array_merge($result['data'], array('myvar' => 'value')); 
     $rendered = $this->templating->render($result['template'], $data); 

     $event->setResponse(new Response($rendered)); 
    } 

2/passer un attribut une requête qui contient vos params et obtenir dans votre contrôleur par $ request-> attributes-> get ('maVar') et passer directement au modèle.

public function onKernelController(FilterControllerEvent $event) 
{ 
    $controller = $event->getController(); 
    if (!$result instanceof AdminInterface) { 
     return; 
    } 
    $event->getRequest->attributes->set('myvar', 'value'); 
} 

pour plus de détails pour les événements du noyau symfony regarder doc. J'espère vous aider.