Zend framework2 ZF2控制器插件

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 /** *

我是ZF2的新手,对于应该是什么样的基本想法,我有一些问题

我正在使用ZfCommons用户模块进行身份验证,它已经安装并且运行正常

现在我想验证用户是否基于此从我的控制器登录(但我不知道如何注册控制器插件,我当前收到以下错误:

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,还是可以为所有控制器执行此操作-在我的应用程序中,所有东西都需要保护,因此必须将侦听器连接到应用程序中的每个控制器是很愚蠢的。不过,再浏览一下文档,就会发现我可以在服务管理器中完成。更新的链接