基于 Symfony2 中其他字段值的字段条件验证
Conditional validation of fields based on other field value in Symfony2
场景是这样的:我有一个单选按钮组。根据它们的值,我应该或不应该验证其他三个字段(它们是否为空,是否包含数字等)。
我能否以某种方式将所有这些值传递给约束条件,并在那里进行比较?
或者直接在控制器中回调是解决这个问题的更好方法?
一般来说,这种情况下的最佳做法是什么?
您需要使用验证组。这允许您仅针对 class 的某些约束来验证对象。可以在 Symfony2 文档中找到更多信息 http://symfony.com/doc/current/book/validation.html#validation-groups and also http://symfony.com/doc/current/book/forms.html#validation-groups
在表单中,您可以定义一个名为 setDefaultOptions
的方法,它应该如下所示:
public function buildForm(FormBuilderInterface $builder, array $options)
{
// some other code here ...
$builder->add('SOME_FIELD', 'password', array(
'constraints' => array(
new NotBlank(array(
'message' => 'Password is required',
'groups' => array('SOME_OTHER_VALIDATION_GROUP'),
)),
)
))
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => function (FormInterface $form) {
$groups = array('Default');
$data = $form->getData();
if ($data['SOME_OTHER_FIELD']) { // then we want password to be required
$groups[] = 'SOME_OTHER_VALIDATION_GROUP';
}
return $groups;
}
));
}
以下 link 提供了有关如何使用它们的详细示例 http://web.archive.org/web/20161119202935/http://marcjuch.li:80/blog/2013/04/21/how-to-use-validation-groups-in-symfony/。
希望对您有所帮助!
我建议你使用 callback validator。
例如,在您的实体中 class:
<?php
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Assert\Callback(methods={"myValidation"})
*/
class Setting {
public function myValidation(ExecutionContextInterface $context)
{
if (
$this->getRadioSelection() == '1' // RADIO SELECT EXAMPLE
&&
( // CHECK OTHER PARAMS
$this->getFiled1() == null
)
)
{
$context->addViolation('mandatory params');
}
// put some other validation rule here
}
}
否则,您可以按照 here 所述构建自己的自定义验证器。
让我知道您需要更多信息。
希望对您有所帮助。
场景是这样的:我有一个单选按钮组。根据它们的值,我应该或不应该验证其他三个字段(它们是否为空,是否包含数字等)。
我能否以某种方式将所有这些值传递给约束条件,并在那里进行比较?
或者直接在控制器中回调是解决这个问题的更好方法?
一般来说,这种情况下的最佳做法是什么?
您需要使用验证组。这允许您仅针对 class 的某些约束来验证对象。可以在 Symfony2 文档中找到更多信息 http://symfony.com/doc/current/book/validation.html#validation-groups and also http://symfony.com/doc/current/book/forms.html#validation-groups
在表单中,您可以定义一个名为 setDefaultOptions
的方法,它应该如下所示:
public function buildForm(FormBuilderInterface $builder, array $options)
{
// some other code here ...
$builder->add('SOME_FIELD', 'password', array(
'constraints' => array(
new NotBlank(array(
'message' => 'Password is required',
'groups' => array('SOME_OTHER_VALIDATION_GROUP'),
)),
)
))
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => function (FormInterface $form) {
$groups = array('Default');
$data = $form->getData();
if ($data['SOME_OTHER_FIELD']) { // then we want password to be required
$groups[] = 'SOME_OTHER_VALIDATION_GROUP';
}
return $groups;
}
));
}
以下 link 提供了有关如何使用它们的详细示例 http://web.archive.org/web/20161119202935/http://marcjuch.li:80/blog/2013/04/21/how-to-use-validation-groups-in-symfony/。
希望对您有所帮助!
我建议你使用 callback validator。
例如,在您的实体中 class:
<?php
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Assert\Callback(methods={"myValidation"})
*/
class Setting {
public function myValidation(ExecutionContextInterface $context)
{
if (
$this->getRadioSelection() == '1' // RADIO SELECT EXAMPLE
&&
( // CHECK OTHER PARAMS
$this->getFiled1() == null
)
)
{
$context->addViolation('mandatory params');
}
// put some other validation rule here
}
}
否则,您可以按照 here 所述构建自己的自定义验证器。
让我知道您需要更多信息。
希望对您有所帮助。