Zend Framework 2 - bjyauthorize -用role链接新用户


Zend Framework 2 - bjyauthorize - Link new user with role

我使用的是bjyauthorize,它对现有用户非常有效。我现在需要动态地添加用户

我可以在表UserRoleLinker中手动设置UserRole之间的连接,但是我如何为新用户设置它的方式?也许我漏掉了什么小事?

在用户插入数据库后,ZfcUser User服务触发register.post事件,因此您只需要侦听该事件。您可以通过将侦听器附加到模块引导中的共享事件管理器来实现这一点。

侦听器接收的事件实例包含用户服务本身,加上user数据和注册期间使用的form,这应该足以使链接

public function onBootstrap(MvcEvent $e)
{
    $app = $e->getApplication();
    $events = $app->getEventManager();
    $shared = $events->getSharedManager();
    $sm = $app->getServiceManager();
    $shared->attach('ZfcUser'Service'User', 'register.post', function ($e) use ($sm) {
         $userService = $e->getTarget();
         $newUser = $e->getParam('user');
         $registrationForm = $e->getParam('form');
         // do something with the new user info, eg, assign new user role...
    });
}

完整的解决方案如下:

public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    //You need a copy of the service manager and it has to be set as a member for the lambda function to call it
    $this->sm = $e->getApplication()->getServiceManager();
    $zfcServiceEvents = $e->getApplication()->getServiceManager()->get('zfcuser_user_service')->getEventManager();
    $zfcServiceEvents->attach('register.post', function($e) {
        /** @var 'User'Entity'UserPdo $user */
        $user = $e->getParam('user');
        //This is the adapter that both bjyAuthorize and zfcuser use
        $adapter     = $this->sm->get('zfcuser_zend_db_adapter');
        //Build the insert statement
        $sql = new 'Zend'Db'Sql'Sql($adapter);
        //bjyAuthorize uses a magic constant for the table name
        $insert = new 'Zend'Db'Sql'Insert('user_role_linker');
        $insert->columns(array('user_id', 'role_id'));
        $insert->values(array('user_id' => $user->getId(), 'role_id' => 'user'), $insert::VALUES_MERGE);
        //Execute the insert statement
        $adapter->query($sql->getSqlStringForSqlObject($insert), $adapter::QUERY_MODE_EXECUTE);