2013-03-11 19 views
8

私は最初の深刻なSymfony2プロジェクトを構築しています。私は自分のユーザー/グループ管理のためにFOSUserBundleを拡張しています。新しいユーザーをデフォルトグループに自動的に追加したいと思います。 私はちょうどこのようなユーザエンティティのコンストラクタを拡張する必要が推測:作成時に新しいFOSUserBundleユーザーをデフォルトグループに追加

/** 
* Constructor 
*/ 
public function __construct() 
{ 
    parent::__construct(); 
    $this->groups = new \Doctrine\Common\Collections\ArrayCollection(); 
    // Get $defaultGroup entity somehow ??? 
    ... 
    // Add that group entity to my new user : 
    $this->addGroup($defaultGroup); 
} 

しかし、私の質問はどのように私は最初の場所で私の$ defaultGroupは実体を得るのですか?

エンティティ内からエンティティマネージャを使用しようとしましたが、それが愚かであり、Symfonyがエラーを投げていることに気付きました。私はこれでグーグルでは、おそらくsetting up a service for thatを除いては本当の解決策が見つかりませんでした...これは私にとってはかなり不明なようですが。

答えて

10

OK、私はartworkadのアイデアの実装に取り​​掛かりました。

私が最初にしたことは、FOSUserEventsクラスを実装していないv1.3.1を使用していたため、composer.jsonの2.0.*@devにFOSUserBundleを更新することでした。これは私の登録イベントを購読するために必要です。私は、引数doctrine.orm.entity_managerを通じて教義へのアクセスを必要なサービスを告げ、XMLで

<!-- Moskito/Bundle/UserBundle/Resources/config/services.xml --> 
<service id="moskito_bundle_user.user_creation" class="Moskito\Bundle\UserBundle\EventListener\UserCreationListener"> 
    <tag name="kernel.event_subscriber" alias="moskito_user_creation_listener" /> 
     <argument type="service" id="doctrine.orm.entity_manager"/> 
</service> 

// composer.json 
"friendsofsymfony/user-bundle": "2.0.*@dev", 

は、それから私は、新しいサービスを追加しました。次に、私はリスナーを作成しました:

// Moskito/Bundle/UserBundle/EventListener/UserCreationListener.php 

<?php 
namespace Moskito\Bundle\UserBundle\EventListener; 

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

/** 
* Listener responsible to change the redirection at the end of the password resetting 
*/ 
class UserCreationListener implements EventSubscriberInterface 
{ 
    protected $em; 
    protected $user; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

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

    public function onRegistrationSuccess(FormEvent $event) 
    { 
     $this->user = $event->getForm()->getData(); 
     $group_name = 'my_default_group_name'; 
     $entity = $this->em->getRepository('MoskitoUserBundle:Group')->findOneByName($group_name); // You could do that by Id, too 
     $this->user->addGroup($entity); 
     $this->em->flush(); 

    } 
} 

そして基本的には、それです!

登録が成功するたびに、onRegistrationSuccess()が呼び出されますので、FormEvent $eventを介してユーザーを取得し、既定のグループに追加します。これをDoctrineに追加します。

3

ユーザーの作成方法を教えていない。一部の管理者がユーザーを作成するか、カスタム登録アクションがある場合は、コントローラーのアクションでグループを設定できます。あなたがfosuserbundlesを使用する場合

$user->addGroup($em->getRepository('...')->find($group_id)); 

は、しかし、あなたがコントローラーにフックする必要があり、登録に構築:https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/controller_events.mdとイベントリスナーを使用しています。

+0

回答の2番目の部分は、私がやりたいことのように見えます。私はそれを実装し、解決策としてここに回答を投稿しようとします。 – Weengs

関連する問題