我想使用Symfony2的FormBuilder组件在服务类中构建动态表单。 但是,这些表单不会立即链接到任何实体(因此我认为表单类服务类型不适用。
我需要问我们的用户一系列问题,根据问题的回答方式,会有无数的结果。(例如:你喜欢芝士蛋糕吗? 如果是,用户将被定向到另一个表单,询问什么样的芝士蛋糕;如果没有,问你是否喜欢冰淇淋。等) 为此,我创建了一个对话器服务,该服务使用 FormFactory 服务实例化。 来自 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方法 - 因此会抛出错误。
使用这种非传统的表单创建方法获取表单视图需要做什么?(或者这行不通?
我的控制器中有一个拼写错误,阻止表单访问视图。 "getView"应该更改为"createView"。 哎 呦。
我还对我的服务进行了更改,将"$this->formFactory->create()"更改为"$this->formFactory->createBuilder();";
对于将来的人们,我将演练服务类中的脚本和随附的 API:
public function get_form( $form_data = array() )
{
$defaults = array_merge( $this->defaults, $form_data );
$builder = $this->formFactory->createBuilder();
正如我在原始帖子中提到的 - $this->formFactory 通过我的服务配置导入"@form.factory"可供我的类使用。那就是createBuilder实例化了Symfony''Component''Form''FormBuilder的实例~http://api.symfony.com/2.0/Symfony/Component/Form/FormBuilder.html
$builder->setData( $defaults );
foreach( $this->fields as $field => $type_ar )
{
$builder = $builder->add( $field, $type_ar['type'], $type_ar['options'] );
}
return $builder->getForm();
}
getForm 方法实例化 Symfony''Component''Form''Form ~ http://api.symfony.com/2.0/Symfony/Component/Form/Form.html 的实例
然后在我的控制器中 -
$form = $dialogue->get_form()->createView();
createView 方法创建了一个 Symfony''Component''Form''FormView 的实例,该实例可以在 Twig 中呈现:
{{ form(form) }}
它有效。