2017-05-07 1 views
1

J'ai 2 actions dans le même contrôleur. Je trouve un problème en passant des valeurs affichées de la 1ère action à la 2ème. J'ai essayé d'utiliser la méthode forward http://symfony.com/doc/current/controller/forwarding.htmlPasser des valeurs d'une action à une autre dans le même contrôleur dans symfony

BTW les deux actions (le 'forwarding' et le 'forwarded to') ont des formulaires avec des soumissions.

Le problème est que je n'ai pas pu accéder à la variable "$ param1" dans la deuxième action. Il va toujours nul.

Y at-il quelque chose que j'ai manqué ici?

Voici mon code:

Ceci est la 1ère action:

/** 
    * 
    * @Route("/new1", name="command_check1") 
    */ 
    public function check1Action(Request $request) 
    { 
     $host = new Host(); 
     $form = $this->createFormBuilder($host) 
      ->add("iPaddress", TextType::class) 
      ->getForm(); 

     $form->handleRequest($request); 

     if ($form->isSubmitted() && $form->isValid()) 
     { 
      $a= $form["iPaddress"]->getData(); //$a= '127.0.0.1' 

      **$this->forward('AcmeBundle:Command:check2', array('param1' => $a));** 

      if($this->pingAction($a)==true){ 
      return $this->redirectToRoute('command_check2'); } 

     } 

      return $this->render('host/new1.html.twig', array(
      'host' => $host, 
      'form' => $form->createView(),)); 
    } 

C'est la 2ème action:

/** 
    * 
    * @Route("/new2", name="command_check2") 
    */ 
    public function check2Action(Request $request, **$param1**) 
    { 

    **var_dump($param1); // here i can get the posted value $param1= '127.0.0.1'** 

     $host = new Host(); 
     $form = $this->createFormBuilder($host) 
      ->add("login", TextType::class) 
      ->add("password", TextType::class) 
      ->getForm(); 
     $form->handleRequest($request); 

    **var_dump($param1); // until here it works good $param1= '127.0.0.1'** 


     if ($form->isSubmitted() && $form->isValid()) 
     { 

    **// the problem is here after submitting the 2nd form 
      var_dump($param1); // $param= null** 


      $b= $form["login"]->getData(); 
      $c= $form["password"]->getData(); 

     } 

     return $this->render('host/new2.html.twig', array(
      'host' => $host, 
      'form' => $form->createView(),)); 
    } 
+0

Pourquoi voulez-vous faire cela? Le transfert n'est pas une bonne pratique dans Symfony. – COil

+0

Je n'ai pas trouvé d'autre solution, j'ai donc essayé la méthode forward. Avez-vous une idée de comment je peux le faire différemment? – User

Répondre

2

Tout d'abord, avant est seulement creux nécessaires différents contrôleurs, en le même contrôleur au lieu de faire un appel en avant simplement appeler l'autre action:

$this->check2Action($request, $a); 

D'autre part, en fonction de votre approche, il est nécessaire de faire un forward ou un appel à check2Action.

C'est ma recommandation en fonction de votre exemple, (code non testé)

/** 
* 
* @Route("/new1", name="command_check1") 
*/ 
public function check1Action(Request $request) 
{ 
    $host = new Host(); 
    $form = $this->createFormBuilder($host) 
     ->add("iPaddress", TextType::class) 
     ->getForm(); 

    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) 
    { 
     $a = $form["iPaddress"]->getData(); //$a= '127.0.0.1' 

     if($this->pingAction($a)==true){ 
     return $this->redirectToRoute('command_check2', ['ip' => $a]); 
     } 
     } 

     return $this->render('host/new1.html.twig', array(
     'host' => $host, 
     'form' => $form->createView(),)); 
} 

Action2:

/** 
    * 
    * @Route("/new2/{ip}", name="command_check2") 
    */ 
    public function check2Action(Request $request, $ip) 
    { 

     $host = new Host(); 
     $form = $this->createFormBuilder($host) 
      ->add("login", TextType::class) 
      ->add("password", TextType::class) 
      ->getForm(); 
     $form->handleRequest($request); 

     if ($form->isSubmitted() && $form->isValid()) 
     { 

      var_dump($ip); 

      $b= $form["login"]->getData(); 
      $c= $form["password"]->getData(); 

     } 

     return $this->render('host/new2.html.twig', array(
      'host' => $host, 
      'form' => $form->createView(),)); 
    } 

Dans l'exemple ci-dessus l'adresse IP présentée dans le action1 est passé comme argument à CHECK2 rediriger, puis la soumission de l'action2 est prise avec cette adresse IP et est toujours disponible.

+0

Merci beaucoup @rafrsr !! Cela fonctionne :)) mais comment passer les paramètres de redirectToRoute au chemin de brindille? J'ai essayé cette Re-check et j'ai eu cette erreur "Variable" ip "n'existe pas dans tiwg" – User

+0

votre exemple est correct, mais est nécessaire de passer le paramètre ip à brindille, par exemple si vous devez afficher l'ip dans ** host/new2 .html.twig ** ajoute ''ip '=> $ ip' dans les paramètres de rendu. – rafrsr

+0

Pouvez-vous m'aider s'il vous plaît si vous avez une idée et merci d'avance :)) @rafrsr http://stackoverflow.com/questions/43891514/draw-charts-with-a-loop-using-highcharts-in -symfony – User