FOSUserBundleのクラスオーバーライド(Register)


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);
    }

}

  • このエントリーをはてなブックマークに追加

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です