Zend framework2 使用Zend framework 2捕获ZfcUser的登录事件

Zend framework2 使用Zend framework 2捕获ZfcUser的登录事件,zend-framework2,zfcuser,Zend Framework2,Zfcuser,我正在使用zfcUserZend Framework 2 public function onBootstrap(MVCEvent $e) { $eventManager = $e->getApplication()->getEventManager(); $em = $eventManager->getSharedManager(); $em->attach( 'ZfcU

我正在使用zfcUserZend Framework 2

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
我想捕获登录事件,以便对其进行处理,并将用户重定向到其他页面

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
我知道如何捕捉注册事件。ie我在module.php文件中放置一个onBootstrap,然后执行以下操作

$em->attach('ZfcUser\Form\RegisterFilter','init',function($e)
public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
整个功能是这样的,

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
但是,当我试图捕获登录事件时,没有任何结果。i、 e

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
$zfcServiceEvents->attach('login.post', function($e) {
                echo "loggedn"; die();
            });
非常感谢你的帮助

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
多谢各位

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
编辑:

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
这就是我调用已注册事件的方式(我知道如何为刚注册的用户调用该事件。但我希望在用户刚刚成功登录时调用该事件

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
引导上的公共函数(MVCEvent$e) {

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
对cptnk代码的响应

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
为了回应cptnk给出的答案,我尝试了以下代码,但不起作用

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
public function onBootstrap(MVCEvent $e)
{
$sharedManager = $e->getApplication()->getEventManager()->getSharedManager();

            $serviceManager = $e->getApplication()->getServiceManager();

                $loginFunction = function ($e) use ($serviceManager) { 
                    echo "eventCaptured" ; die();
                };

            $sharedManager->attach('ZfcUser\Service\User', 'login.post', $loginFunction);

}
我仍然无法捕获登录事件。有什么想法吗

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
cptnik提出了一个很好的建议;他问我是否已经覆盖了ZFcUser服务

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
'zfcuser' => array(
        // telling ZfcUser to use our own class
        'user_entity_class'       => 'BaseModel\Entity\User',
        // telling ZfcUserDoctrineORM to skip the entities it defines
        'enable_default_entities' => false,
    ),
您的代码没有显示什么是
$zfcServiceEvents
,或者它来自何处。我假设它是引用zfcuser事件的事件管理器。我的方法有点不同,因为我将事件附加到zf2共享管理器。可能您在这段代码方面有问题

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
您可以像这样抓取
sharedEventManager

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
$sharedManager = $e->getApplication()->getEventManager()->getSharedManager();
编辑:我不太清楚如何在Module.php
onBootstrap
函数中获取$serviceManager和应用程序。

试试这个

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
    $events = $e->getApplication()->getEventManager()->getSharedManager();
    // Handle login
    $events->attach('ZfcUser\Authentication\Adapter\AdapterChain', 'authenticate.success', function($e) {
        $userId = $e->getIdentity();
        // do some stuff
    });

在Module.php中添加以下内容:

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
public function onBootstrap(MvcEvent $e) {
    $em = $e->getApplication()->getEventManager();
    $UserListener = $e->getApplication()->getServiceManager()->get('UserListener');
    $em->attachAggregate($UserListener);
   }
并使用以下代码创建src/User/Listener/UserListener.php:

public function onBootstrap(MVCEvent $e)
{
        $eventManager = $e->getApplication()->getEventManager();
        $em           = $eventManager->getSharedManager();
        $em->attach(
                'ZfcUser\Form\RegisterFilter',
                'init',
                function($e)
                { }
}
    namespace LcUser\Listener;

    use Zend\EventManager\AbstractListenerAggregate;
    use Zend\EventManager\EventManagerInterface; 
    use Zend\ServiceManager\ServiceLocatorAwareInterface;
    use Zend\ServiceManager\ServiceLocatorInterface;

 class LcUserListener extends AbstractListenerAggregate implements    ServiceLocatorAwareInterface {

/**
 * @var ServiceLocatorInterface
 */
protected $serviceManager;

/**
 * 
 * @param ServiceLocatorInterface $serviceLocator
 */
public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
    $this->serviceManager = $serviceLocator;
}

/**
 * 
 * @return \Zend\ServiceManager\ServiceLocatorInterface
 */
public function getServiceLocator() {
    return $this->serviceManager;
}

public function attach(EventManagerInterface $events) {
    $sharedManager = $events->getSharedManager();
    $this->listeners[] = $sharedManager->attach('ZfcUser\Authentication\Adapter\AdapterChain', 'authenticate.success', array($this, 'userLog'));
}

public function userLog(Event $e) {

    $em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');

    $userlog = new UserLogin(); // User Login is my User Log table to record login details as below
    $user = $em->getRepository('MyUser\Entity\User')
            ->findOneBy(array('id' => $e->getIdentity()));
    $userlog->setGroupId($user->getId());
    $userlog->setUserId($e->getIdentity());
    $userlog->setEmail($_POST['identity']);
    $userlog->setIpAddresses($_SERVER['SERVER_ADDR']);
    $em->persist($userlog);
    $em->flush();
}
}

您好cptnk。感谢您的回答。我不知道如何使用您提供的代码。您从哪里获得$serviceManager?还有。您从哪里获得$this->app?您好cptnk。我尝试了上述方法,但仍然无法捕获事件。我已将我的修订代码附在上面。您的代码看起来不错。您是否碰巧覆盖了ZfcU您的module.config.php中的ser\Service\User?嘿,cptnk。我确实覆盖了zfcuser_实体。我已经在我的配置上面附上了覆盖该实体的内容。