我正在zf2中编写一个控制器插件。 我使用以下方法从插件中获取控制器,但它返回null。
$controller = $this->getController()
有什么建议吗?
答案 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)
您的插件中没有设置控制器的选项有两个。
__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注入。建造者在建造后召集。在伪代码中,会发生这种情况:
$plugin = new $class;
$plugin->setController($controller);
如果您有这样的插件:
use Zend\Mvc\Controller\Plugin\AbstractPlugin;
class MyPlugin extends AbstractPlugin
{
public function __construct()
{
// $this->getController() === null
}
}
您注意到该阶段没有设置控制器。