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')
));
}
希望对您有所帮助
看起来 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')
));
}
希望对您有所帮助