6

ZfcUser、BjyAuthorize、およびデータベース用のDoctrineでZend Framework 2を使用しています。これまでのところ、登録などは非常にうまく機能しています。私の問題は、登録されたユーザーに役割が割り当てられていないため、登録時にユーザーに役割「ユーザー」を追加したいということです。

これを「登録」イベントに添付できると思いますが、その方法がわかりません。

誰かが私を助けてくれることを願っています...

(私はこのチュートリアルを使用して zfcuser などをセットアップしました。http://samminds.com/2013/03/zfcuser-bjyauthorize-and-doctrine-working-together/ )

public function onBootstrap(MvcEvent $e)
{
    $zfcServiceEvents = $e->getApplication()->getServiceManager()->get('zfcuser_user_service')->getEventManager();
    $zfcServiceEvents->attach('register', function($e) {
        $user = $e->getParam('user');
        // probably the role must be added here, with $user->addRole();
        // but how do i get the user Role Entity to add from DB?

});
4

4 に答える 4

7

DangelZM の回答に基づいて構築し、イベント マネージャーに関する別のリファレンス (投稿の最後にあるリンクを参照) を使用して、潜在的な ZfcUser イベント リスナーをユーザー リスナー オブジェクトに整理するこのソリューションを思いつきました。

注: NvUser という独自のユーザー モジュールを作成したので、モジュールの名前によっては、NvUser のすべての参照をユーザー モジュール名に置き換える必要があります。

概要

イベント リスナーを共有イベント マネージャーにアタッチし、イベント リスナーのコールバックを格納できる NvUserListener オブジェクトを作成しました。

NvUser/Module.php 内:

<?php
namespace NvUser;

use Zend\Mvc\MvcEvent;
use NvUser\Listener\NvUserListener;

class Module
{
    public function onBootstrap(MvcEvent $mvcEvent)
    {
        $em = $mvcEvent->getApplication()->getEventManager();
        $em->attach(new NvUserListener());
    }               
}

NvUser/src/NvUser/Listener/NvUserListener.php 内:

<?php
namespace NvUser\Listener;

use Zend\EventManager\AbstractListenerAggregate;
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\Event;

class NvUserListener extends AbstractListenerAggregate
{
    public function attach(EventManagerInterface $events)
    {
        $sharedManager = $events->getSharedManager();
        $this->listeners[] = $sharedManager->attach('ZfcUser\Service\User', 'register', array($this, 'onRegister'));
        $this->listeners[] = $sharedManager->attach('ZfcUser\Service\User', 'register.post', array($this, 'onRegisterPost'));
    }

    public function onRegister(Event $e)
    {
        $sm = $e->getTarget()->getServiceManager();
        $em = $sm->get('doctrine.entitymanager.orm_default');
        $user = $e->getParam('user');
        $config = $sm->get('config');
        $criteria = array('roleId' => $config['zfcuser']['new_user_default_role']);
        $defaultUserRole = $em->getRepository('NvUser\Entity\Role')->findOneBy($criteria);

        if ($defaultUserRole !== null)
        {
            $user->addRole($defaultUserRole);
        }
    }

    public function onRegisterPost(Event $e)
    {
        $user = $e->getParam('user');
        $form = $e->getParam('form');

        // Do something after user has registered
    }
}

NvUser/config/module.config.php 内:

<?php
namespace NvUser;

return array(
    'zfcuser' => array(
        'new_user_default_role' => 'user',
    ),
);

参考文献:

Zend Framework 2 イベント マネージャーについて

于 2014-08-22T03:28:39.697 に答える
1

この作品も。

  public function onBootstrap(MvcEvent $mvcEvent)
     {
         $zfcServiceEvents = $mvcEvent->getApplication()-getServiceManager()->get('zfcuser_user_service')->getEventManager();
         $zfcServiceEvents->attach('register', function($e) use($mvcEvent) {
             $user = $e->getParam('user');
             $em = $mvcEvent->getApplication()->getServiceManager()-get('doctrine.entitymanager.orm_default');
             $defaultUserRole = $em->getRepository('SamUser\Entity\Role')-find('id_of_your_role_on_table_role_for_example: '2'');
             $user->addRole($defaultUserRole);
         });
     }
于 2015-10-23T19:53:30.810 に答える
0

MySQLトリガーを使用しました

DROP TRIGGER IF EXISTS `user_role_after_insert_trig`;
DELIMITER //
CREATE TRIGGER `user_role_after_insert_trig` AFTER INSERT ON `user`
 FOR EACH ROW begin
  insert into user_role_linker (user_id,role_id) values (new.user_id, 5);
end
//
DELIMITER ;
于 2013-09-04T15:53:46.417 に答える