Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php FormBuilder能否在服务类中用于生成未连接到实体类的表单?_Php_Forms_Symfony - Fatal编程技术网

Php FormBuilder能否在服务类中用于生成未连接到实体类的表单?

Php FormBuilder能否在服务类中用于生成未连接到实体类的表单?,php,forms,symfony,Php,Forms,Symfony,我想使用Symfony2的FormBuilder组件在服务类中构建动态表单。但是,这些表单不会立即链接到任何实体(因此我认为表单类服务类型不适用) 我需要问我们的用户一系列问题,根据问题的回答方式,会有很多结果。(例如:你喜欢芝士蛋糕吗?如果喜欢,用户将被引导到另一个表格,询问什么样的芝士蛋糕;如果不喜欢,问你是否喜欢冰淇淋……等等)为此,我创建了一个Dialoguer服务,该服务用FormFactory服务实例化。从services.yml: dialoguer: class: My\

我想使用Symfony2的FormBuilder组件在服务类中构建动态表单。但是,这些表单不会立即链接到任何实体(因此我认为表单类服务类型不适用)

我需要问我们的用户一系列问题,根据问题的回答方式,会有很多结果。(例如:你喜欢芝士蛋糕吗?如果喜欢,用户将被引导到另一个表格,询问什么样的芝士蛋糕;如果不喜欢,问你是否喜欢冰淇淋……等等)为此,我创建了一个Dialoguer服务,该服务用FormFactory服务实例化。从services.yml:

dialoguer:
    class: My\MainBundle\Services\Dialoguer    
    arguments: ['@forms.factory']
对话过程的每一步都由一个不同的对话类处理——所有对话类都是AbstractDialogue类的子类。dialoguer服务查看已经应答的数据,并找到下一步要询问的适当对话框

dialoguer服务将@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\u 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~

getForm方法实例化Symfony\Component\Form\Form~的一个实例

然后在我的控制器中-

$form = $dialogue->get_form()->createView();
createView方法创建Symfony\Component\Form\FormView的实例,该实例可以在细枝中呈现:

{{ form(form) }} 
它起作用了

{{ form(form) }}