Php 如何使用关联验证实体?
我有表格课:Php 如何使用关联验证实体?,php,forms,symfony,validation,Php,Forms,Symfony,Validation,我有表格课: ... public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name', TextType::class); $builder->add('surname', TextType::class); $builder->add('address', IntegerType::class); // write cust
...
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', TextType::class);
$builder->add('surname', TextType::class);
$builder->add('address', IntegerType::class); // write custom field type?
}
...
我使用它来验证客户实体,其中$address字段是关联:
...
/**
* @ORM\OneToOne(targetEntity="Address")
* @Assert\CustomAddress // write this custom validation constraint?
*/
private $address;
...
现在如何验证$address值?现在我得到了(我并不惊讶的是):
应为类型为“AppBundle\Entity\Address”的参数,并给定“string”
您需要为地址实体创建一个表单,例如:
use AppBundle\Entity\Address;
// ...
class AddressType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('address1', TextType::class);
$builder->add('city', TextType::class);
// ...
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Address::class,
]);
}
}
use AppBundle\Form\Type\AddressType;
// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', TextType::class);
$builder->add('surname', TextType::class);
$builder->add('address', AddressType::class);
}
然后更新您的CustomerType
以使用该类,例如:
use AppBundle\Entity\Address;
// ...
class AddressType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('address1', TextType::class);
$builder->add('city', TextType::class);
// ...
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Address::class,
]);
}
}
use AppBundle\Form\Type\AddressType;
// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', TextType::class);
$builder->add('surname', TextType::class);
$builder->add('address', AddressType::class);
}
然后,您的地址实体将自动验证,而无需自定义验证约束。Okey有效。所以现在我需要写转换器来从int转换到address实体?或者在$fomr->submit(…)之前获取它?我是对的?你不应该做这样的事情-你的关联被视为一个完整的实体,而不是传统的外键整数。所以你根本不需要数据转换器。谢谢你的回答。你是对的。不管怎样,我最终得到了一个例外:“复合表单在提交时需要一个数组或NULL”。我现在放弃了,我明天会尝试解决这个问题。我从来没有见过这样的错误:)如果你需要更多的帮助,请告诉我