HTML   发布时间:2022-04-14  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了symfony-2.1 – 表单:避免将null设置为非提交的字段大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的模型(源代码简化):
class Collection
{
    public $page;
    public $limit;
}

和表单类型:

class CollectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $builder->add('page','Integer');
        $builder->add('limit','Integer');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'FSC\Common\Rest\Form\Model\Collection',));
    }
}

我的控制器:

public function getUsersAction(request $request)
{
    $collection = new Collection();
    $collection->page = 1;
    $collection->limit = 10;

    $form = $this->createForm(new CollectionType(),$collection)
    $form->bind($request);

    print_r($collection);exit;
}

当我POST / users /?form [page] = 2& form [limit] = 20时,响应是我所期望的:

Collection Object
(
    [page:public] => 2
    [limit:public] => 20
)

现在,当我POST / users /?form [page] = 3时,响应为:

Collection Object
(
    [page:public] => 3
    [limit:public] =>
)

limit变为null,因为它未提交.

我想得到

Collection Object
(
    [page:public] => 3
    [limit:public] => 10 // The default value,set before the bind
)

问题:如何更改表单行为,以便忽略未提交的值?

解决方法

如果只是参数问题(GET参数),您可以将默认值定义到路由文件中
route_name:
pattern: /users/?form[page]={pagE}&form[limit]={limit}
defaults: { _controller: CompanyNameBundlename:ControllerName:ActionName,limit:10 }

另一种方法可以是使用钩子(即PRE_BIND)并将该值手动更新到此事件中.通过这种方式,您没有将“逻辑”扩展到多段代码中.

最终代码 – 由Adrien建议 – 将是

<?php

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvents;

class IgnoreNonSubmittedFieldSubscriber implements EventSubscriberInterface
{
    private $factory;

    public function __construct(FormFactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_BIND => 'preBind');
    }

    public function preBind(FormEvent $event)
    {
        $submittedData = $event->getData();
        $form = $event->getForm();

        // We remove every child that has no data to bind,to avoid "overriding" the form default data
        foreach ($form->all() as $name => $child) {
            if (!isset($submittedData[$name])) {
                $form->remove($Name);
            }
        }
    }
}

大佬总结

以上是大佬教程为你收集整理的symfony-2.1 – 表单:避免将null设置为非提交的字段全部内容,希望文章能够帮你解决symfony-2.1 – 表单:避免将null设置为非提交的字段所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。