Symfony2 の FormBuilder コンポーネントを使用して、サービス クラス内で動的フォームを構築したいと考えています。ただし、これらのフォームはすぐにエンティティにリンクされるわけではありません (そのため、フォーム クラス サービス タイプは適用されないと思います)。
ユーザーに一連の質問をする必要があり、質問への回答に応じて無数の結果が得られます (例: チーズケーキは好きですか? はいの場合、ユーザーはチーズケーキの種類を尋ねる別のフォームに誘導されます。いいえ、アイスクリームが好きかどうか尋ねてください..など) これを行うために、FormFactory サービスでインスタンス化される Dialguer サービスを作成しました。services.yml から:
dialoguer:
class: My\MainBundle\Services\Dialoguer
arguments: ['@forms.factory']
ダイアログ プロセスの各ステップは、異なるダイアログ クラスによって処理されます。これらはすべて、AbstractDialogue クラスの子クラスです。ダイアログ サービスは、既に回答されたデータを見て、次に尋ねる適切なダイアログを見つけます。
ダイアログ サービスは、@forms.factory サービスを適切なダイアログ クラスに渡します。この場合は Start:
namespace My\MainBundle\Services\Dialoguer\Individual;
use My\MainBundle\Services\Dialoguer\AbstractDialogue as AbstractDialogue;
class Start extends AbstractDialogue
{
static $stem = 'check_registration';
protected $fields = array(
'over_thirtyfive' => array(
'type' => 'choice',
'options' => array(
'label' => 'Are you over 35?',
'choices'=>array('yes'=>'Yes','no'=>'No'),
'expanded'=> true,
'multiple'=>false
)
)
);
....
function __construct( $formFactory )
{
$this->formFactory = $formFactory;
}
親の AbstractDialogue クラスから、get_form メソッドは各フィールドを調べ、上記の仕様に基づいてフォームに追加します。
public function get_form( $form_data = array() )
{
$defaults = array_merge( $this->defaults, $form_data );
$builder = $this->formFactory->create();
$builder->setData( $defaults );
foreach( $this->fields as $field => $type_ar )
{
$builder = $builder->add( $field, $type_ar['type'], $type_ar['options'] );
}
//return $builder->getForm();
return $builder;
}
そして、最後にコントローラ クラスで:
$dialogue = $this->get('dialoguer')->process($request, 'Individual');
$form = $dialogue->get_form()->getView();
$args = compact('form');
return $this->render("MyMainBundle:Forms:process_app.form.html.twig", $args);
最後に、ここに問題があります: 上記の get_form メソッドは Symfony\Component\Form\Form インスタンスを渡しますが、これには getView メソッドがないため、エラーがスローされます。
この非伝統的なフォーム作成方法を使用してフォーム ビューを取得するには、どうすればよいですか? (それともうまくいかないのでしょうか?)