0

我正在构建一个 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) 我冒着多次执行它的风险(如果我在请求中执行多个操作)。

我错过了什么?

谢谢!

4

1 回答 1

2

从代码的外观来看,它试图从视图渲染器访问视图对象。这会自动初始化 postDispatch,这就是为什么您的代码只能作为 postDispatch 钩子工作的原因。

我认为您遇到的部分痛苦是因为您正在尝试通过在调度过程中呈现模板来混合应用程序和表示逻辑。您在问题中说您的插件代码不是特别漂亮,但是您可以轻松地简化它并同时解决您的问题。

我建议完全删除这个插件,然后从布局本身渲染这些模板,例如:

<?=$this->render('includes/header.phtml')?>

您可以以相同的方式在布局中进行登录检查,也可以将其移至视图助手。由于已经设置了视图对象,这应该可以解决您的问题。

于 2013-01-21T13:20:58.120 回答