2017-04-24 46 views
2

我目前正在學習Symfony窗​​體。而且,我遇到的代碼並不按我想要的方式工作。我想要做的是讓用戶向我的默認控制器提交數據,並且數據是否有效,是否將其重定向到另一個方法,以便我可以將這些數據提交到數據庫。Symfony 3通過重定向傳遞對象

我遇到的問題是將具有簡單名稱和日期字段的任務對象的數據傳遞給另一個命名路由。

這裏是我寫的一些代碼,只是作爲一種類結構的基本形式。

TaskType.php

namespace AppBundle\Entity\Forms; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\DateType; 

use AppBundle\Entity\Forms\Task; 

use Symfony\Component\OptionsResolver\OptionsResolver; 


class TaskType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    $builder 
     ->add('task', TextType::class) 
     ->add('dueDate', DateType::class, array('label' => 'Register')) 
     ->add('save', SubmitType::class) 
    ; 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => Task::class, 
    )); 
} 

DefaultController.php

...

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 

use AppBundle\Entity\Forms\TaskType; 


use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\DateType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 

... 

/** 
* @Route("/", name="homepage") 
*/ 
public function indexAction(Request $request) 
{ 


    $form = $this->createForm(TaskType::class); 
    $form->handleRequest($request); 

if ($form->isSubmitted() && $form->isValid()) { 
    // $form->getData() holds the submitted values 
    // but, the original `$task` variable has also been updated 
    $task = $form->getData(); 

    // ... perform some action, such as saving the task to the database 
    // for example, if Task is a Doctrine entity, save it! 
    // $em = $this->getDoctrine()->getManager(); 
    // $em->persist($task); 
    // $em->flush(); 

    return $this->redirectToRoute('success', array($task)); 
} 

return $this->render('forms/task.html.twig', array(
    'form' => $form->createView(), 
)); 

} 

/** 
* @Route("/success", name="success") 
*/ 

public function successAction(Request $request) { 
    dump($request);die; 
} 

所以,你可以看到,我只是路過的任務作爲一個數組。在這段代碼中,我想也許我可以通過他的請求來訪問這個任務,但這似乎並不奏效。當我試圖將task [] $任務參數添加到successAction時,找不到任務。

那麼有沒有辦法在第二個動作中訪問對象?或者我只是在這裏倒退?我應該在做重定向之前插入數據或進行其他數據操作嗎?還是有辦法將Task對象傳遞給控制器​​中的另一個方法,以便我可以在那裏處理數據?

感謝您的輸入

+0

您的成功操作必須使用任務參數(ID或其他)後,您可以使用ParamConverter這個識別碼轉換的任務對象。 http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html – COil

回答

4

您傳遞的參數將被忽略,因爲路徑「success」不帶任何參數。另外我不認爲你可以傳遞對象。你可以序列化它,例如作爲json字符串,然後反序列化它。

我覺得你的方法是最好的選擇是使用一個會話來保存數據(確保對象是可序列化):

$this->container->get('session')->set('task', $task); 

return $this->redirectToRoute('success'); 

,然後在你的成功行動檢索:

public function successAction(Request $request) { 
    $task = $this->container->get('session')->get('task'); 
    if ($task === null || !$task instanceof Task) { 
     return $this->createNotFoundException(); 
    } 
    // Do something 
} 

另見:​​

+0

這工作謝謝 – Kaley36