不能在ZF2构造函数中初始化我的插件函数


Can't initialize my plugin function in ZF2 constructor

我对ZF2很陌生,我正在准备一个带有简单登录和CRUD系统的演示应用程序。现在登录我已经准备了一个插件,其中包括一些功能,将认证用户,返回登录的用户数据,返回登录状态等。但问题是,我所面临的是我不能初始化任何变量到我的控制器的构造函数,这将存储任何返回值从插件。总是显示service not found exception.

请找到我的插件代码如下:

AuthenticationPlugin.php

<?php
namespace Album'Controller'Plugin;
use Zend'Mvc'Controller'Plugin'AbstractPlugin;
use Zend'Session'Container as SessionContainer;
use Zend'View'Model'ViewModel;
use Album'Entity'User;
class AuthenticationPlugin extends AbstractPlugin{
    protected $entityManager;
    protected $usersession;
    public function __construct(){
        $this->usersession = new SessionContainer('UserSession');   
    }
    public function dologin($email,$password)
    {
        $getData = $this->em()->getRepository('Album'Entity'User')->findOneBy(array('email' => $email, 'password' => $password));
        if(count($getData)){
            $this->usersession->offsetSet('userid', $getData->getId());
            return true;
        }
        else{
            return false;
        }   
    }
    public function isloggedin(){
        $userid = $this->usersession->offsetGet('userid');
        if(!empty($userid)){
            return true;    
        }   
        else{
            return false;   
        }
    }
    public function logindata(){
        $userid = $this->usersession->offsetGet('userid');
        $getData = $this->em()->getRepository('Album'Entity'User')->findOneBy(array('id' => $userid));
        return $getData;
    }
    public function logout(){
        $this->usersession->offsetUnset('userid');  
    }
    public function em(){
        return $this->entityManager = $this->getController()->getServiceLocator()->get('Doctrine'ORM'EntityManager');   
    }
}
?>

在my module.config.php

'controller_plugins' => array(
        'invokables' => array(
            'AuthPlugin' => 'Album'Controller'Plugin'AuthenticationPlugin',
        )
    ),

现在我在控制器中这样做:

protected $entityManager;
protected $isloggedin;
protected $authentication;
public function __construct(){
    $this->authentication = $this->AuthPlugin();
    $this->isloggedin = $this->authentication->isloggedin();    
}
我得到的错误如下:

An error occurred执行过程中出现错误;请再试一次以后。附加信息:Zend ' ServiceManager '例外' ServiceNotFoundException

文件:

D:'xampp'htdocs'subhasis'zf2-tutorial'vendor'zendframework'zendframework'library'Zend'ServiceManager'ServiceManager.php:555
消息:

Zend'Mvc'Controller'PluginManager::get was unable to fetch or create an instance for AuthPlugin

但是如果我在任何控制器动作中编写上述构造函数代码,一切都很好。在ZF1中,我可以初始化init()方法中的任何变量,并可以在任何操作中使用该变量。我如何在ZF2中做到这一点?这里,我想检测用户是否登录了构造函数本身。现在我必须在每个我不想要的操作中调用插件。

我该怎么做?

您收到的错误是因为您试图在控制器的__construct方法中使用ServiceManager(通过Zend'Mvc'Controller'PluginManager)。

当控制器注册为invokable类时,服务管理器(ControllerManager)负责创建控制器实例。一旦创建了,它就会调用控制器的各种默认的"初始化器",其中也包括插件管理器。通过在__construct中的代码,它试图在设置之前使用插件管理器。

可以通过使用控制器工厂来解决这个问题,而不是在module.config.php中使用可调用的

'controllers' => [
    'factories' => [
        'MyModule'Controller'Foo' => 'MyModule'Controller'FooControllerFactory',
    ],
],

然后工厂

namespace MyModule'Controller'FooControllerFactory;
use Zend'ServiceManager'FactoryInterface;
use Zend'ServiceManager'ServiceLocatorInterface;
class FooControllerFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $controllerManager)
    {
        $serviceManager = $controllerManager->getServiceLocator();
        $controllerPluginManager = $serviceManager->get('ControllerPluginManager');
        $authPlugin = $controllerPluginManager->get('AuthPlugin');
        return new FooController($authPlugin);
    }
}

最后,更新控制器__construct以添加新的参数并删除$this->authPlugin()

的调用
class FooController extends AbstractActionController
{
    public function __construct(AuthPlugin $authentication)
    {
        $this->authentication = $authentication;
        $this->isloggedin     = $authentication->isloggedin();
    }
}