Zend_Layout配置:何时以及如何?

时间:2013-01-21 12:28:49

标签: zend-framework zend-layout

我正在构建一个Zend Framework MVC应用程序,并且很难配置我的Zend_Layout。

首先,我的应用程序资源都在资源插件中,这些插件使用以下代码加载到bootstrap中:

protected function _initResourcePlugins() {

    $this->registerPluginResource('Log');        
    $this->registerPluginResource('Router'); 
    $this->registerPluginResource('Db');        
    $this->registerPluginResource('View');
}

我没有为我的Layout创建资源插件,因为我在前端控制器插件中处理登录/注销,我的布局配置取决于用户是否登录(以及其他与上下文相关的信息)。我正在使用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装饰器无法渲染... "

我不确定它正在寻找哪个视图对象。 (布局和应用程序视图是否有单独的?)我不确定应该在何处/如何注入或提供它。如果它追逐我设置为资源的视图,我会认为通过咨询引导程序可以很容易地找到它...

我真的不想将布局附加到postDispatch事件,因为a)它没有感觉到语义正确,并且b)我冒险执行多次(如果我执行多个操作)请求)。

我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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