我对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();
}
}