Zend framework2 ZF2控制器插件
我是ZF2的新手,对于应该是什么样的基本想法,我有一些问题 我正在使用ZfCommons用户模块进行身份验证,它已经安装并且运行正常 现在我想验证用户是否基于此从我的控制器登录(但我不知道如何注册控制器插件,我当前收到以下错误:Zend framework2 ZF2控制器插件,zend-framework2,Zend Framework2,我是ZF2的新手,对于应该是什么样的基本想法,我有一些问题 我正在使用ZfCommons用户模块进行身份验证,它已经安装并且运行正常 现在我想验证用户是否基于此从我的控制器登录(但我不知道如何注册控制器插件,我当前收到以下错误: Zend\Mvc\Controller\PluginManager::get was unable to fetch or create an instance for ZfcUserAuthentication 我的控制器如下所示: <?php /** *
Zend\Mvc\Controller\PluginManager::get was unable to fetch or create an instance for ZfcUserAuthentication
我的控制器如下所示:
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController as AbstractActionController;
use Zend\View\Model\ViewModel as ViewModel;
class IndexController extends AbstractActionController
{
public function __construct()
{
$plugin = $this->plugin('ZfcUserAuthentication');
}
public function indexAction()
{
return new ViewModel();
}
public function testAction()
{
return new ViewModel();
}
}
根据文档,您可以使用以下
$this->zfcUserAuthentication()->hasIdentity()
$this->zfcUserAuthentication()->getIdentity()
引发异常的原因是您正在请求构造函数中的插件。由于插件如何绑定到控制器,根本不可能在控制器的构造函数中使用插件
背景
创建对象时首先调用构造函数。在\uu construct()
之前没有调用其他方法。如果通过setter方法将某些内容注入此新实例中,则无法在构造函数中访问此方法
代码示例:
$obj = new MyClass();
$obj->setFoo('foo');
class MyClass()
{
protected $foo;
public function __construct()
{
var_dump($this->foo); // null!
}
public function setFoo($foo)
{
$this->foo = $foo;
}
}
这似乎很明显,但这正是Zend Framework 2中控制器和控制器插件管理器的情况。在创建对象后,将注入管理器:
$controller = new MySomethingController;
$controller->setPluginManager($plugins);
另请参见Github上的。因此:不幸的是,您无法访问构造函数中的插件
备选方案
您可以通过以下任何操作访问插件:
class IndexController extends AbstractActionController
{
public function indexAction()
{
// This works!
$plugin = $this->plugin('ZfcUserAuthentication');
return new ViewModel();
}
public function testAction()
{
// This works too!
$plugin = $this->plugin('ZfcUserAuthentication');
return new ViewModel();
}
}
您还可以将侦听器附加到控制器的调度,以便对每个操作(而不是您指定的操作)进行函数调用:
use Zend\Mvc\MvcEvent;
class IndexController extends AbstractActionController
{
public function indexAction()
{
return new ViewModel();
}
public function testAction()
{
return new ViewModel();
}
protected function attachDefaultListeners()
{
parent::attachDefaultListeners();
$events = $this->getEventManager();
$events->attach(MvcEvent::EVENT_DISPATCH, array($this, 'checkUserIdentity'));
}
public function checkUserIdentity()
{
// This works!
// It is called for both indexAction() and testAction()
$plugin = $this->plugin('ZfcUserAuthentication');
}
}
您甚至可以将此逻辑从控制器中删除,以便将其重新用于多个控制器:
class Module
{
public function onBootstrap($e)
{
$app = $e->getApplication();
$em = $app->getEventManager()->getSharedManager();
$em->attach('MyModule\Controller\MyController', MvcEvent::EVENT_DISPATCH, function($e) {
$controller = $e->getController();
// This works!
$plugin = $controller->plugin('ZfcUserAuthentication');
});
}
}
因此,根据您需要的干燥程度,可以在构造函数之外访问插件。同样有效,控制器中有一个\u call()
方法,它代理插件()
方法:感谢您的澄清,刚刚给了您+1:)如果您查看错误消息,您会发现没有加载I ZfcuseAuthentication-这就是问题所在。因此,使用最简单的方法并将代码放入module.php文件中-我是否需要为每个控制器执行$em->attach,还是可以为所有控制器执行此操作-在我的应用程序中,所有东西都需要保护,因此必须将侦听器连接到应用程序中的每个控制器是很愚蠢的。不过,再浏览一下文档,就会发现我可以在服务管理器中完成。更新的链接