我正在构建一个 Zend Framework MVC 应用程序并且很难配置我的 Zend_Layout。
首先,我的应用程序资源都在资源插件中,这些资源插件在引导程序中加载,代码如下:
protected function _initResourcePlugins() {
$this->registerPluginResource('Log');
$this->registerPluginResource('Router');
$this->registerPluginResource('Db');
$this->registerPluginResource('View');
}
我没有为我的布局创建资源插件,因为我在前端控制器插件中处理登录/注销,而我的布局配置取决于用户是否登录(以及其他与上下文相关的信息)。我在 application.ini 中使用以下几行来激活布局:
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/professional"
resources.layout.layout = "ver1"
然后我使用前端控制器插件来配置它。这是插件:
public function postDispatch(\Zend_Controller_Request_Abstract $request) {
$layout = Zend_Layout::getMvcInstance();
$path = $layout->getLayoutPath();
// include static content
$layout->header = include($path . '/includes/header.phtml');
$layout->footer = include($path . '/includes/footer.phtml');
if(APPLICATION_ENV == 'development') {
$layout->dev = include($path . '/includes/dev.phtml');
}
if(RW_Helper::isLoggedIn()) {
$layout->sidebar = include($path . '/includes/sbar_secure.phtml');
} else {
$layout->sidebar = include($path . '/includes/sbar_public_login.phtml');
}
}
(我知道它不是特别漂亮,但我稍后会处理)。
现在,问题是我可以运行它的唯一事件是 postDispatch 事件。如果我尝试在 dispatchLoopStartup 上运行它,我会收到一个错误,例如“警告:UiWidgetElement 装饰器无法在没有注册的视图对象的情况下呈现... ”
我不确定它正在寻找哪个视图对象。(布局和应用程序视图是否有单独的视图?)而且我不确定我应该在哪里/如何注入或提供它。如果它正在追逐我设置为资源的视图,我会认为它可以通过咨询引导程序很容易地找到它......
我真的不想将 Layout 附加到 postDispatch 事件,因为 a) 它在语义上感觉不正确,并且 b) 我冒着多次执行它的风险(如果我在请求中执行多个操作)。
我错过了什么?
谢谢!