我正在 zf2 中编写一个控制器插件。我使用以下方法从插件中获取控制器,但它返回 null。
$controller = $this->getController()
有什么建议吗?
我正在 zf2 中编写一个控制器插件。我使用以下方法从插件中获取控制器,但它返回 null。
$controller = $this->getController()
有什么建议吗?
请注意,此答案基于我对 ZF1 的体验,以及对 ZF2 代码的快速浏览。看看这个答案。
我还没有玩过 ZF2,但是如果调度过程和插件与 ZF1 相似,则插件无法访问控制器(至少不是以普通的方式),因为某些控制器甚至没有被实例化插件挂钩。
更新:快速浏览了一些库存的 ZF2 控制器插件(因为我似乎无法找到有关创建自定义插件的官方文档),并查看如下检查:
$controller = $this->getController();
if (!$controller || !method_exists($controller, 'plugin')) {
//...
因此,在某些情况下似乎可能未设置控制器。由于插件还支持(我理解为)事件侦听器,我的猜测是它们仍然可以在响应过程中的不同时间使用,这可能是在分配控制器之前。
希望用过ZF2的人能过来给我指正;但也许我至少给你指出了一个合理的方向。
有两个选项您没有在插件中设置控制器。
__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
}
}
您注意到在该阶段没有设置控制器。