2017-04-24 13 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; 
} 

、あなたが見ることができるように、私はちょうど配列としてタスクに渡しています。このコードでは、彼が要求してタスクにアクセスできるかもしれないと思ったが、それはうまくいかないようだ。そして、successActionにTask [] $タスクパラメータを追加しようとすると、そのタスクは見つかりませんでした。

ここで2番目のアクションでオブジェクトにアクセスする方法はありますか?または私はちょうどちょっとここの後方にいるのですか?リダイレクトを行う前に、データの挿入やその他のデータ操作を行う必要がありますか?または、そこにデータを処理できるように、タスクオブジェクトをコントローラの別のメソッドに渡す方法がありますか?

ありがとうご入力

+0

タスクオブジェクトにこのIDを変換するParamConverterを使用することができた後、あなたの成功のアクションは、タスク・パラメータ(IDまたは何でも)を使用する必要があります。 http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html – COil

答えて

4

"成功"ルートには引数がないため、渡すパラメータは無視されます。また、私はあなたがオブジェクトを渡すことができるとは思わない。あなたはそれをシリアル化することができます。 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

関連する問題