На данный момент я успешно использовал группы проверки, но теперь я застрял с группами проверки и вложенными сопоставленными объектами.
Поясню проблему на упрощенном примере.
Мои объекты: Адрес, Повреждение, Устройство
/**
* @ORM\Entity()
*/
class Address extends ...
{
/**
* @var string
* @ORM\Column(type="string", name="postcode", nullable=true)
* @Assert\NotBlank(
* groups={
* "damage_responsible_address",
* "appliance_repairer_address",
* })
*/
private $postcode;
...
/**
* @ORM\Entity()
*/
class Damage extends ...
{
/**
* @var boolean
* @ORM\Column(type="boolean", name="responsible", nullable=true)
* @Assert\NotBlank(groups={"damage"})
*/
private $responsible;
/**
* @ORM\OneToOne(targetEntity="Address", cascade={"persist","remove"})
* @ORM\JoinColumn(name="responsible_address_id", referencedColumnName="id")
* @Assert\Valid()
*/
private $responsibleAddress;
/**
* @ORM\ManyToMany(targetEntity="Appliance", orphanRemoval=true, cascade={"persist", "remove"})
* @ORM\JoinTable(name="coronadirect_cuzo_home_damage_appliances",
* joinColumns={@ORM\JoinColumn(name="damage_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="appliance_id", referencedColumnName="id")}
* )
*/
private $appliances;
...
/**
* @ORM\Entity()
*/
class Appliance extends ...
{
/**
* @var boolean
* @ORM\Column(type="boolean", name="to_repair", nullable=true)
* @Assert\NotBlank(groups={"appliance"})
*/
private $toRepair;
/**
* @ORM\OneToOne(targetEntity="Address", cascade={"persist","remove"})
* @ORM\JoinColumn(name="repairer_address_id", referencedColumnName="id")
* @Assert\Valid()
*/
private $repairAddress;
...
Для определения своих форм я использую AddressType, DamageType и ApplianceType:
class DamageType extends ...
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('appliances', 'collection', array(
'type' => 'home_damage_appliance_type',
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'options' => array(
'cascade_validation' => true,
)
));
$builder->add('responsible', 'choice', array(
'choices' => $this->getYesNoChoiceArray(),
'expanded' => true,
'multiple' => false,
));
$builder->add('responsibleAddress', 'address_type', array(
'required' => true
));
...
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Damage',
'cascade_validation' => true,
'validation_groups' =>
function(FormInterface $form) {
$groups = array('damage');
if ($form->getData()->getResponsible() == true) {
$groups[] = 'damage_responsible_address';
}
return $groups;
}
));
}
Я добавляю группу damage_responsible_address, когда в форме для ответственного установлено значение true. В противном случае я не хочу, чтобы адрес проверялся.
class ApplianceType extends ...
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('toRepair', 'choice', array(
'choices' => $this->getYesNoChoiceArray(),
'expanded' => true,
'multiple' => false,
));
$builder->add('repairAddress', 'address_type', array(
'required' => true
));
...
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Appliannce',
'cascade_validation' => true,
'validation_groups' =>
function(FormInterface $form) {
$groups = array('appliance');
if ($form->getData()->getToRepair() == true) {
$groups[] = 'appliance_repairer_address';
}
return $groups;
}
));
}
Как и в предыдущем случае, когда toRepair имеет значение true, я хочу проверить адрес.
Что происходит?
Если Ответственность за ущерб верна, а устройство toRepair ложно, форма выдает ошибки проверки на ответственном адресе, НО также и на адресе устройства.
То же самое и в обратном случае: если адрес устройства недействителен (toRepar имеет значение true), то answerAddress также недействителен (даже если ответственный имеет значение false).
Группы проверки адресов не смотрят, в какой форме они определены, а просто прикрепляют их к каждому элементу адреса в форме.
Можно ли определить группы проверки только для формы?
Я использую Doctrine и Symfony 2.3.6.