25

バージョン: Symfony 2.2

ユーザーが自分の Web サイトに登録するときに、デフォルトの役割を追加しようとしています。私は FOSUserBundle を使用していますが、ユーザーがデータベースでロール フィールドを登録すると、空になっていることがわかります。この巨大なバンドルから始めますが、理解するのは簡単ではありません。だから私はすべてのドキュメントを読みましたが、何をすべきかわかりません。

今のところ、このロールを動的に追加するイベントを作成しますが、機能しません (エラーはありませんが、データベースはまだ空です)。

私のイベント:

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class AddDefaultRoleListener implements EventSubscriberInterface {

  private $container;

  public function __construct(Container $container)
  {
    $this->container = $container;
  }

  /**
   * {@inheritDoc}
   */
  public static function getSubscribedEvents()
  {
    return array(
        FOSUserEvents::REGISTRATION_SUCCESS => 'onAddDefaultRoleSuccess',
    );
  }

  public function onAddDefaultRoleSuccess(FormEvent $event)
  {
    $doctrine = $this->container->get('doctrine');
    $em = $doctrine->getManager();

    $user = $event->getForm()->getData();
    $user->addRole('ROLE_USER');
    //$user->setRoles(array('ROLE_USER'));

    $em->persist($user);
  }
}

ご覧のとおり、REGISTRATION_SUCCESS をリッスンする単純なイベントを作成しましたが、何も機能していないようです。イベントとサービスでの私の最初の試みです。だから誰かがアドバイスを持っているなら、私はそれを受け入れます:)

4

6 に答える 6

39

FOSUserBundle への主な貢献者 (リンクされたコメント内) によって示されているように、これを行うための推奨される方法は、REGISTRATION_SUCCESS イベントにイベント リスナーを登録し$event->getForm()->getData()、ユーザーにアクセスして変更するために使用することです。これらのガイドラインに従って、次のリスナーを作成しました (動作します!):

<?php

// src/Acme/DemoBundle/EventListener/RegistrationListener.php

namespace Acme\DemoBundle\EventListener;

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Listener responsible for adding the default user role at registration
 */
class RegistrationListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess',
        );
    }

    public function onRegistrationSuccess(FormEvent $event)
    {
        $rolesArr = array('ROLE_USER');

        /** @var $user \FOS\UserBundle\Model\UserInterface */
        $user = $event->getForm()->getData();
        $user->setRoles($rolesArr);
    }
}

また、サービスは次のように登録する必要があります。

// src/Acme/DemoBundle/Resources/config/services.yml
services:
    demo_user.registration_listener:
        class: Acme\DemoBundle\EventListener\RegistrationListener
        arguments: []
        tags:
            - { name: kernel.event_subscriber }

User クラス __construct() にデフォルトのロールを追加すると、この他の回答で示されているように、いくつかの問題が発生する可能性があることに注意してください。

于 2013-06-22T20:53:06.860 に答える
37

私がやったことは、エンティティコンストラクターをオーバーライドすることです:

ここに私のEntity/User.phpの一部があります

public function __construct()
{
    parent::__construct();
    // your own logic
    $this->roles = array('ROLE_USER');
}

これが怠惰な方法です。適切でより良い方法が必要な場合は、@ RayOnAirの回答を参照してください

于 2013-04-14T09:08:03.543 に答える
1

さて、それで動作しています:

 public function onAddDefaultRoleSuccess(FilterUserResponseEvent $event)
{
    $doctrine = $this->container->get('doctrine');
    $em = $doctrine->getManager();

    $user = $event->getUser();
    $user->addRole('ROLE_BLOGGER');

    $em->persist($user);
    $em->flush();
}

リスナーを変更し、REGISTRATION_COMPLETEDを使用することを知っています。誰かがそれを行うためのより良いアイデアを持っている場合は、躊躇しないでください:)

于 2013-04-13T23:25:48.527 に答える