【问题标题】:Zend_Layout configuration: when and how?Zend_Layout 配置:何时以及如何配置?
【发布时间】:2013-01-21 12:28:49
【问题描述】:

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

我错过了什么?

谢谢!

【问题讨论】:

标签: zend-framework zend-layout


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2013-07-05
    • 2015-06-13
    • 1970-01-01
    • 2013-03-06
    相关资源
    最近更新 更多