如何从zendframework 2中的控制器插件中获取控制器?

时间:2012-11-01 06:09:41

标签: php zend-framework2

我正在zf2中编写一个控制器插件。 我使用以下方法从插件中获取控制器,但它返回null。

$controller = $this->getController()

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

注意,这个答案是基于我对ZF1的经验,并快速浏览一下ZF2代码。查看this answer

我还没有使用过ZF2,但是如果调度过程和插件类似于ZF1,插件就无法访问控制器(至少不是以微不足道的方式),因为控制器甚至没有实例化一些插件钩子。

更新:快速浏览一些ZF2控制器插件(因为我似乎无法找到关于创建自定义插件的官方文档),以及见检查like the following

$controller = $this->getController();
if (!$controller || !method_exists($controller, 'plugin')) {
//...

因此在某些情况下似乎可能无法设置控制器。由于插件也支持(我理解的)一个事件监听器,我的猜测是它们仍然可以在响应过程中的不同时间使用,这可能在分配控制器之前。

希望someone who's used ZF2 can come along and set me straight;但也许我至少在一个合理的方向上指出了你。

答案 1 :(得分:1)

您的插件中没有设置控制器的选项有两个。

  1. 您在发送之前从插件管理器调用插件,因此尚未设置控制器
  2. 您在__construct()
  3. 期间调用插件中的控制器

    对于第一个,一个典型的例子是模块类中的onBootstrap()方法,显然你没有控制器:

    public function onBootstrap($e)
    {
      $app = $e->getApplication();
      $sm  = $app->getServiceManager();
    
      $plugins = $sm->get('ControllerPluginManager');
      $plugin  = $plugins->get('my-plugin');
    
      // $plugin->getController() === null
    }
    

    这似乎是一个明显的例子,但是在其他情况下你错误地假设控制器已经存在(例如,在应用程序运行期间,在路由阶段;调度仍然必须到来)。

    第二个例子是因为控制器注入了setter注入。建造者在建造后召集。在伪代码中,会发生这种情况:

    $plugin = new $class;
    $plugin->setController($controller);
    

    如果您有这样的插件:

    use Zend\Mvc\Controller\Plugin\AbstractPlugin;
    
    class MyPlugin extends AbstractPlugin
    {
      public function __construct()
      {
        // $this->getController() === null
      }
    }
    

    您注意到该阶段没有设置控制器。