我有与实体Message
的 ManyToOne 关系的实体User
:
class Message
{
...
/**
* @var User $sender
*
* @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\User")
* @ORM\JoinColumn(name="sender_id", referencedColumnName="id")
*
**/
private $sender;
...
}
如果$sender
没有email
值,我需要为我的表单创建新字段,所以我Message
在 Contoller 中为实体创建表单:
$user = $this->getUser();
$message = new Message();
$message->setSender($user);
$formBuilder = $this->createFormBuilder($message, array(
'cascade_validation' => true
));
$formBuilder->add('body', 'textarea');
if (!$user->getEmail()) {
$formBuilder->add('email', 'email', array(
'property_path' => 'sender.email'
));
}
我在validation.yml
实体中有一些验证规则User
。我可以通过我对User
另一个实体表单中的实体的验证规则自动验证此字段吗?我不知道该怎么做。
我现在找到了解决方法:创建新的MissingEmailType
:
class MissingEmailType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email')
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\UserBundle\Entity\User',
'validation_groups' => array(
'MissingEmail'
),
));
}
public function getName()
{
return 'missing_email';
}
}
但是看起来很复杂。有没有更好的解决方案?