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そして、エンティティの検証ルールがいくつかありますUserUser別のエンティティのフォーム内のエンティティの検証ルールによって、このフィールドを自動的に検証できますか? やり方がわかりません。

私は今回避策を見つけました: create new 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 に答える