2013-02-28 3 views
1

Lorsque je fais un forward() dans un contrôleur, je perds mon itinéraire et les paramètres route_parameters.Symfony2 Pourquoi les objets de requête d'imbrication vers l'avant?

Lorsque j'ai ParentAction, cela fait un renvoi à ChildAction. Dans Childaction je fais return $this->render('myTemplate.html.twig', array()); puis les attributs de la requête sont imbriqués!

Ainsi, lorsque le modèle est rendu, au lieu de $request['attributes']['_route_parameters'], j'obtiens $request['attributes']['request']['attributes']['_route_parameters'].

Bien que dans ChildAction, lorsque je fais un $this->getRequest(); la hiérarchie est normale.

Est-ce un bug, ou est-ce que je fais quelque chose de mal?

Répondre

0

Une solution possible serait de transmettre votre demande en tant que second paramètre lors de la transmission.

$response = $this->forward('MyBundle:MyController:myAction', array('request' => $request)); 

De plus, comme avant est juste un raccourci pour le noyau des fonctionnalités de Symfony2, this peut probablement aider.

+0

Pouvez-vous vérifier mon modifier? Je peux lire la demande et autres, mais il se passe quelque chose de bizarre. – Nealv

0

Dans mon cas, le code suivant aidé:

$subRequest = $this->container->get('request')->duplicate(
    array(), 
    null, 
    array('topicId' => $topicId,'_controller' => 'SomeBundle:Topic:close')); 

return $this->container->get('http_kernel') 
    ->handle($subRequest, HttpKernelInterface::SUB_REQUEST); 

« Sujet » est TopicController et « fermer » est closeAction

1

La raison est que symfony ne suppose pas que vous avez les mêmes paramètres d'itinéraire. Ainsi, lorsque vous transférez, vous devez réapprovisionner les paramètres d'itinéraire requis par le nouvel itinéraire, même s'ils sont identiques.

(Soit dit en passant, vous devez également fournir des paramètres de requête pour la nouvelle route.)

public function indexAction($param) 
{ 

    return $this->forward(
     'AppBundle\\Controller\\DefaultController::otherAction', 
     array("someOtherParam" => $param), 
     $request->query->all() // Causes query string params to be copied 
    ); 
} 

// This route has a different parameter. 
public function otherAction($someOtherParam) ... 
Questions connexes