Условная проверка полей на основе другого значения поля в Symfony2

Итак, вот сценарий: у меня есть группа переключателей. Основываясь на их значении, я должен или не должен проверять другие три поля (являются ли они пустыми, содержат ли они числа и т. Д.).

Можно ли как-то передать все эти значения в ограничение и сравнить их там?

Или обратный вызов непосредственно в контроллере — лучший способ решить эту проблему?

Вообще, какова лучшая практика в этом случае?

8

Решение

Я предлагаю вам использовать валидатор обратного вызова.

Например, в вашем классе сущности:

<?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
}
}

В противном случае вы можете создать свой собственный валидатор, как описано Вот.

Дайте мне знать, что вам нужно больше информации.

Надеюсь это поможет.

6

Другие решения

Вам нужно использовать группы проверки. Это позволяет вам проверять объект только на основании некоторых ограничений этого класса. Больше информации можно найти в документации Symfony2 http://symfony.com/doc/current/book/validation.html#validation-groups а также 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;
}
));
}

Следующая ссылка предоставляет подробный пример того, как вы можете использовать их http://web.archive.org/web/20161119202935/http://marcjuch.li:80/blog/2013/04/21/how-to-use-validation-groups-in-symfony/.

Надеюсь это поможет!

5

По вопросам рекламы [email protected]