3

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

$controller = $this->getController()

有什么建议吗?

4

2 回答 2

2

请注意,此答案基于我对 ZF1 的体验,以及对 ZF2 代码的快速浏览。看看这个答案

我还没有玩过 ZF2,但是如果调度过程和插件与 ZF1 相似,则插件无法访问控制器(至少不是以普通的方式),因为某些控制器甚至没有被实例化插件挂钩。

更新:快速浏览了一些库存的 ZF2 控制器插件(因为我似乎无法找到有关创建自定义插件的官方文档),并查看如下检查:

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

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

希望用过ZF2的人能过来给我指正;但也许我至少给你指出了一个合理的方向。

于 2012-11-01T06:31:55.033 回答
1

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

  1. 您在调度之前从插件管理器调用插件,因此尚未设置控制器
  2. 您在插件内部调用控制器__construct()

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

public function onBootstrap($e)
{
  $app = $e->getApplication();
  $sm  = $app->getServiceManager();

  $plugins = $sm->get('ControllerPluginManager');
  $plugin  = $plugins->get('my-plugin');

  // $plugin->getController() === null
}

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

第二个例子是因为控制器注入了setter注入。setter 在构造之后被调用。在伪代码中,会发生这种情况:

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

如果你有这样的插件:

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

class MyPlugin extends AbstractPlugin
{
  public function __construct()
  {
    // $this->getController() === null
  }
}

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

于 2012-11-01T10:44:48.160 回答