Итак, вот сценарий: у меня есть группа переключателей. Основываясь на их значении, я должен или не должен проверять другие три поля (являются ли они пустыми, содержат ли они числа и т. Д.).
Можно ли как-то передать все эти значения в ограничение и сравнить их там?
Или обратный вызов непосредственно в контроллере — лучший способ решить эту проблему?
Вообще, какова лучшая практика в этом случае?
Я предлагаю вам использовать валидатор обратного вызова.
Например, в вашем классе сущности:
<?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
}
}
В противном случае вы можете создать свой собственный валидатор, как описано Вот.
Дайте мне знать, что вам нужно больше информации.
Надеюсь это поможет.
Вам нужно использовать группы проверки. Это позволяет вам проверять объект только на основании некоторых ограничений этого класса. Больше информации можно найти в документации 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/.
Надеюсь это поможет!