2

我有与实体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';
    }
}

但是看起来很复杂。有没有更好的解决方案?

4

1 回答 1

0

您可以将页面重定向到用户个人资料页面,而不是加载消息表单并声明用户需要在添加消息之前添加电子邮件。如果您快速重定向或创建弹出窗口,则用户可能不会被关闭,只要他们在添加电子邮件后可以返回原始页面即可。然后验证很简单,因为您只需要验证用户实体。

于 2014-02-24T16:37:43.460 回答