Symfony2 有条件的验证

Symfony2 Validation with conditions

看起来 symfony 试图通过验证帮助您解决很多问题,但我有点困惑。我有一个看起来像这样的地址对象

/**
 * @ORM\Entity
 * @ORM\Table(name="address")
 */
class Address {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     * @var int $id
     */
    private $id;

    /**
     * @ORM\Column(name="street1", type="string", nullable=true)
     * @var string $street1
     */
    private $street1;

    /**
     * @ORM\Column(name="street2", type="string", nullable=true)
     * @var string $street2
     */
    private $street2;

    /**
     * @ORM\Column(name="street3", type="string", nullable=true)
     * @var string $street3
     */
    private $street3;

    /**
     * @ORM\Column(name="city", type="string", nullable=true)
     * @var string $city
     */
    private $city;

    /**
     * @ORM\Column(name="state", type="string", nullable=true)
     * @var string $state
     */
    private $state;

    /**
     * @ORM\Column(name="zip", type="integer", nullable=true)
     * @var integer $zip
     */
    private $zip;

    /**
     * @var AddressType
     * This is only used for previous addresses
     * @DoctrineAssert\Enum(entity="RLD\AppBundle\DBAL\AddressType")
     * @ORM\Column(name="address_type", type="AddressType", nullable=true)
     */
    private $addressType;
}

我正在使用这个对象两次。一次用于当前地址,另一次用于以前的地址。问题是,如果用户超过 5 年不在当前地址,我只需要以前地址的信息。我怀疑我需要扩展 class 才能得到我想要的工作。但是,即使在扩展之后,我也不确定如何进行条件验证。

问题

如何进行条件验证?

if(currentAddress < 5)
    validate previous address;

有人对此有想法吗?此表单似乎包含一个需要此功能的共同主题。任何 help/suggestions 将不胜感激。

使用 Traits 怎么样?

http://php.net/manual/de/language.oop5.traits.php

为您的默认属性定义一个特征,然后创建 2 个 classes:

  • Class 地址

  • Class 上一个地址

class PreviousAddress 具有附加属性。

然后您可以通过 instanceof 进行验证:

if ($object instanceof PreviousAddress) {
    // has type
}

您可以使用验证组来选择性地激活验证回调。例如:

地址实体

/**
 *
 * @Assert\Callback(methods={"validateCurrentAddress"}, groups={"currentAddress"})
 * @Assert\Callback(methods={"validatePreviousAddress"}, groups={"previousAddress"})
 */
class Address
{

    ....

        public function validatePreviousAddress(ExecutionContextInterface $context)
    {
        if (/* is not valid */)
        {
            $context->addViolationAt('/*your field*/','error.previous_address_invalid');
        }

    }

}

CurrentAddressFormType

class CurrentAddressFormType extends AbstractType
{

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'=> 'Acme\DemoBundle\Entity\Address',
            'validation_groups' => array('currentAddress')
        ));
    }
}

PreviousAddressFormType

class PreviousAddressFormType extends AbstractType
{

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'=> 'Acme\DemoBundle\Entity\Address',
            'validation_groups' => array('previousAddress')
        ));
    }

希望对您有所帮助