0

私はいくつかのフォームを持っていますが、ユーザーがまだログインしていない場合は、このフォームにいくつかの追加フィールド(電子メール、ユーザー名など)を表示して検証したいと思います。

今、私はそのようにそれを行います:新しいものを作成しますFormType

class QuickRegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email')
            ->add('username')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\UserBundle\Entity\User',
            'validation_groups' => array(
                'QuickRegister'
            ),
        ));
    }

    public function getName()
    {
        return 'quick_register';
    }
}

コントローラの場合:

$user = $this->getUser();

$formBuilder = $this->createFormBuilder($message, array(
    'cascade_validation' => true
));

$formBuilder->add('body', 'textarea');

if (!$user) {
    $formBuilder->add('quick_register', new QuickRegisterType(), array(
        'property_path' => 'sender'
    ));
}

テンプレートの場合:

{% if form.quick_register is defined %}
    {# render this fields #}
{% endif %}

そして$form->bind($ request);の直後 $ message-> getSender();で有効なユーザーを取得します。すべてが良いです!ただし、フォームの検証の直後に他のアクションを実行する必要があります。

if ($form->isValid()) {
    $sender = $message->getSender();
    if (!$sender->getId()) {
        // perform some work with just registered user
        // like sending email, generate passwords, so on
    }
}

そして、このアクションは、すべてのプロジェクトのそのようなフォームで一般的に同じになるので、最適化したいと思います。

最初は、DIコンテナで新しいサービスを作成し、次のように呼び出すことができると思います

$this->container->get('my.user_service')->afterQuickRegister($sender);

しかし今、私はsymfony2のフォームイベントについてhttp://symfony.com/doc/current/cookbook/form/dynamic_form_generation.htmlページで読みました。

今はわかりませんが、自分の目的に使えますか?DIコンテナでそのようなフォームサブスクライバーを作成できますか?そして、一般的に、私はUser作成直後にどういうわけか変更できますか?このための正しい形式のイベントは何ですか?ありがとう!

4

1 に答える 1

0

FormEventsで実装します。

form.type.quick_register:
    class: Acme\UserBundle\Form\Type\QuickRegisterType
    arguments: [ @form.type.quick_register.subscriber ]
    tags:
        - { name: form.type, alias: quick_register }

そして、form.type.quick_register.subscriberサービスによって加入者を渡します。サブスクライバーでは、POST_BINDイベントでフォームの検証を確認し、自分の作業を行います。素晴らしい!

于 2012-11-16T14:21:34.497 に答える