zfcuser在注册后添加用户角色

时间:2013-07-11 14:51:44

标签: zend-framework doctrine-orm zfcuser bjyauthorize

我正在使用Zend Framework 2和ZfcUser,BjyAuthorize和Doctrine作为数据库。到目前为止,注册等工作非常顺利。我的问题是,注册用户没有分配角色,所以我想在注册期间向用户添加角色“user”。

我想我可以将此附加到“注册”事件,但我不知道该怎么做。

我希望有人可以帮助我...

(我使用本教程设置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 个答案:

答案 0 :(得分:6)

在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',
    ),
);

参考文献:

Understanding the Zend Framework 2 Event Manager

答案 1 :(得分:5)

也许这不是最好的解决方案,但它对我有用。 在配置范围中添加user_role_id选项。

    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');
            $config = $mvcEvent->getApplication()->getServiceManager()->get('config');
            $defaultUserRole = $em->getRepository('SamUser\Entity\Role')->find($config['user_role_id']);
            $user->addRole($defaultUserRole);
        });
    }

也许有人会提供更好的解决方案。

答案 2 :(得分: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);
         });
     }

答案 3 :(得分: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 ;