Symfony2でユーザ認証の機能をつけようと思うと現在ではFOSUserBundleを使うことになります。この際にユーザ情報として姓名や住所等の情報を追加することになると思います。その場合は必ずこのクラスのオーバーライドが必要になります。ここではこのオーバーライドの方法を記述します。
FOSUserBundleのインストールは完了し、App/UserBundleがFOSUserBundleを継承しているとして下記の説明を行います。
なお、firstnameやlastname, genderなどのEntityクラスへの追加は事前に行なっておいてください。ここでは割愛します。
1.app/config/config.ymlの編集
2.App/UserBundle/Resources/config/services.ymlの編集
3.App\UserBundle\Form\Type\RegistrationFormType.phpの作成
4.App\UserBundle\Form\Handler\RegistrationFormHandler.phpの作成
の順番でオーバーライドします。
1.app/config/config.ymlの編集
fos_user: db_driver: orm firewall_name: main user_class: App\UserBundle\Entity\User registration: form: type: app_user_registration handler: app_user.form.handler.registration
2.App/UserBundle/Resources/config/services.ymlの編集
parameters: services: app_user.registration.form.type: class: App\UserBundle\Form\Type\RegistrationFormType arguments: [%fos_user.model.user.class%] tags: - { name: form.type, alias: app_user_registration } app_user.form.handler.registration: class: App\UserBundle\Form\Handler\RegistrationFormHandler arguments: ["@fos_user.registration.form", "@request", "@fos_user.user_manager", "@fos_user.mailer", "@fos_user.util.token_generator"] scope: request public: false
3.App\UserBundle\Form\Type\RegistrationFormType.phpの作成
<?php namespace App\UserBundle\Form\Type; use Symfony\Component\Form\FormBuilderInterface; use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType; class RegistrationFormType extends BaseType { public function buildForm(FormBuilderInterface $builder, array $options) { parent::buildForm($builder, $options); // add your custom field $builder->add('your_column'); } public function getName() { return 'app_user_registration'; } }
4.App\UserBundle\Form\Handler\RegistrationFormHandler.phpの作成
FOSRegistrationFormHandlerのコンストラクトに
FormInterface $form
Request $request
UserManagerInterface $userManager
MailerInterface $mailer
TokenGeneratorInterface $tokenGenerator
がインジェクションされていますので利用したい場合は$this->form, $this->requestなどでアクセスが可能です。
どこでインジェクションしているの?という疑問はapp/consig/services.ymlのarguments: [“@fos_user.registration.form”, “@request”, “@fos_user.user_manager”, “@fos_user.mailer”, “@fos_user.util.token_generator”]が解決してくれます。
<?php namespace App\UserBundle\Form\Handler; use FOS\UserBundle\Form\Handler\RegistrationFormHandler as BaseHandler; use FOS\UserBundle\Model\UserInterface; class RegistrationFormHandler extends BaseHandler { protected function onSuccess(UserInterface $user, $confirmation) { parent::onSuccess($user, $confirmation); } }