【问题标题】:Symfony2 non-mapped fields added in pre_set_data not present in form's children collection在表单的子集合中不存在 pre_set_data 中添加的 Symfony2 非映射字段
【发布时间】:2015-07-18 05:42:44
【问题描述】:

我对与非映射表单字段 (Symfony 2.6.6) 相关的问题感到困惑。

我有一个基于 Product 实体的表单类:

class ProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options) {

        $builder->add('hidden1', 'hidden', array(
            'data' => 'Welcome hidden1!'
            'mapped' => false,
        ))
        ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
            $form = $event->getForm();
            $form->add('hidden2', 'hidden', array(
                'data' => 'Welcome hidden2!'
                'mapped' => false,
            ));
        }
    }

    public function getName()
    {
        return 'my_form';
    }
}

如果你仔细看……我添加了两个非映射的隐藏字段:

  • hidden1 直接添加到$builder->add(...)
  • ...但是hidden2 被添加到PRE_SET_DATA event 中。

显然这两个字段是相同的(隐藏和未映射),就像symfony documentation 所说:

可以在控制器中访问未映射字段的数据:

$form->get('unmapped-field')->getData();

嗯……

现在,在controllerOne 中创建表单并将我的实体传递给controllerTwo

public function controllerOneAction(Product $product, Request $request)
{
    $form = $this->createForm(new productType(), $product, array(
        'action' => $this->generateUrl('controller_two_route')
    ));
    return $form->createView();
}

好的,渲染表单 ({{ form(form) }}) 我可以看到我的两个隐藏字段:

<input type="hidden" id="my_form_hidden1" name="my_form[hidden1]" 
    value="Welcome hidden1!">
<input type="hidden" id="my_form_hidden2" name="my_form[hidden2]" 
    value="Welcome hidden2!">

案例 1:

在另一个控制器controllerTwo 我想验证这个表单。我再次创建表单,但这次我没有传递任何实体(第二个空参数):

public function controllerTwoAction(Request $request) {
    $form = $this->createForm(new productType(), null);

    echo $form->get('hidden1')->getData(); // prints 'Welcome hidden1' in screen
    echo $form->get('hidden2')->getData(); // throw an exception... 
}

所以...尝试在$form 中获取hidden2 会引发异常(在...Component/Form/Form.php 中的第964 行),因为hidden2 不存在于表单的子项中。

案例 2:

但是,将表单与一个空的 Product 对象 (new Product()) 绑定,它可以工作,为什么?

public function controllerTwoAction(Request $request) {
    $form = $this->createForm(new productType(), new Product());

    echo $form->get('hidden1')->getData(); // prints 'Welcome hidden1' in screen
    echo $form->get('hidden2')->getData(); // prints 'Welcome hidden2' in screen
}

为什么在案例 1 中 hidden1 是表单的孩子,而 hidden2 不是?

注意:我需要在pre_set_data 中添加hidden2,因为该值在我的Product 实体中,这是(我认为)访问我的基础实体的唯一方式。

【问题讨论】:

    标签: validation symfony symfony-forms


    【解决方案1】:

    PRE_SET_DATA 事件在您向表单传递数据时被调用(createForm() 的第二个参数)。传递 NULL 时,不会调用此事件。

    此事件的目的是根据传递的数据更改表单字段,因此在表单中没有默认数据的情况下使用它是没有意义的。

    【讨论】:

    • 感谢您的回答。文档中没有提到那个小细节,我已经花了几个小时......再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    相关资源
    最近更新 更多