【问题标题】:Symfony2 FormType optional whole or nothingSymfony2 FormType 可选整体或全无
【发布时间】:2016-04-09 21:20:41
【问题描述】:

我在 Symfony2 中有表单,其中包含 2 个子表单类型,代表我的实体中的 2 个关系。 invoiceAddress 始终是必需的,它工作正常,但我希望 deliveryAddress 仅在 deliveryAdress 的所有输入为空时才保持可选。 当我将它设置为不需要时,symfony 将 deliveryAddress 设置为 null,而表单中没有填写任何内容,但是当某些字段被填写时,它不会对该实体运行断言验证。所以我想要实现的是在表单为空时告诉 symfony,然后将 deliveryAddress 设置为 null,但是当表单中的某些内容被设置时,然后以正常方式运行验证。有什么办法吗?谢谢。

我的表单类型看起来像这样,在控制器中我有标准的 $form->isValid 条件。

$builder->add('invoiceAddress',new AddressType())
        ->add('deliveryAddress', new AddressType(),["required" => false])

AdressType 只包含一些像这样的原始类型映射:

$builder->add('firstName')
        ->add('lastName')...

在地址实体中:

    /**
 * @Assert\NotBlank
 * @ORM\Column
 * @var string
 */
private $firstName;

/**
 * @Assert\NotBlank
 * @ORM\Column
 * @var string
 */
private $lastName;

【问题讨论】:

    标签: php symfony symfony-forms


    【解决方案1】:

    如果您正确设置实体和断言,这应该可以开箱即用。当Address 对象为空时,表单组件将返回null 作为模型数据并将其设置在父级上。当属性为null 时,将跳过该属性的验证。它应该看起来像这样:

    class Order
    {
        /**
         * @var Address
         *
         * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Address")
         * @ORM\JoinColumn(onDelete="CASCADE", nullable=false)
         *
         * @Assert\NotBlank()
         * @Assert\Valid()
         */
        private $invoiceAddress;
    
        /**
         * @var Address
         *
         * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Address")
         * @ORM\JoinColumn(onDelete="SET NULL", nullable=true)
         *
         * @Assert\Valid()
         */
        private $deliveryAddress;
    
        public function getInvoiceAddress()
        {
            return $this->invoiceAddress;
        }
    
        public function setInvoiceAddress(Address $address)
        {
            $this->invoiceAddress = $address;
        }
    
        public function getDeliveryAddress()
        {
            return $this->deliveryAddress;
        }
    
        public function setDeliveryAddress(Address $address = null)
        {
            $this->deliveryAddress = $address;
        }
    }
    

    【讨论】:

    • @Assert\Valid() 在 deliveryAddress 上很厉害!谢谢你:)
    猜你喜欢
    • 2015-02-10
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多