私はいくつかのフォームを持っていますが、ユーザーがまだログインしていない場合は、このフォームにいくつかの追加フィールド(電子メール、ユーザー名など)を表示して検証したいと思います。
今、私はそのようにそれを行います:新しいものを作成します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
作成直後にどういうわけか変更できますか?このための正しい形式のイベントは何ですか?ありがとう!