【问题标题】:Zend Framework LayoutZend 框架布局
【发布时间】:2010-11-07 15:08:37
【问题描述】:

我从 Zend Framework 开始,我想了解 Bootstrap 文件。我了解到所有_init 方法都是默认执行的,但这对我来说似乎很困惑。无论如何,这不是我想问的。

出现了$this->bootstrap('layout'); 操作,我不确定我是否理解这一点。这是 application.ini 文件中的 resource.layout 变量吗?我想真正深入了解引导过程。

我要求您逐步解释。 提前致谢!

这是我的引导文件:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAutoload()
    {
        $moduleLoader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath' => APPLICATION_PATH
        ));
        return $moduleLoader;
    }

    function _initViewHelpers()
    {
        $this->bootstrap('layout');

        $layout = $this->getResource('layout');
        $view = $layout->getView();
        $view->doctype('XHTML1_STRICT');
        $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
        $view->headTitle()->setSeparator(' - ');
        $view->headTitle('Zend Framework Tutorial');
    }
}

【问题讨论】:

  • 刚刚在我的推特流twitter.com/joedevon/status/2464729062 上链接到这个问题,希望有人会很快出现并提供详细的解释。我让它完全正常工作,但并不完全理解它在做什么:)
  • $this->bootstrap('layout');这一行确保在 _initViewHelpers() 的其余部分运行之前已经设置了“布局”。

标签: php zend-framework bootstrapping


【解决方案1】:

来自application.ini的线路

resources.layout[] = 

相当于:

_initLayout() {}

Bootstrap.php

他们都在初始化新对象,并且这个对象被设置为bootstrap参数,它是一些应用程序资源的容器(由_init方法返回的值)。

有一个一个执行,所以为了确保一个资源在当前资源之前初始化,你强制顺序,使用:

_initSomeResource() {
    $this->bootstrap('otherResource');
    // ..
    return $someValue; 
}

_initOtherResource() {
    // .. 
}

所以资源实例化的顺序是:

  1. otherResource
  2. someResource

现在,你也可以使用:

$bootstrap->getParam('someResource'); // returns $someValue

注意,你可能会遇到Circular Dependency错误,当你尝试在每个之前执行对方。

您可以根据需要使用任意数量的_init 方法,但为了使它们可重用,您可以将它们分离到自己的类中,实现Zend_Application_Resource_Abstract 类。

有一些开箱即用的应用程序资源,您可以在Zend/Application/Resource 目录中找到它们。这些是您从application.ini 引用的资源,即:

resources.view.encoding = "utf-8" ; in application.ini
Zend/Application/Resource/View.php (path to the resource class)
Zend_Application_Resource_View::setEncoding('UTF-8'); // equivalent pseudocode

希望现在更清楚了。

【讨论】:

    【解决方案2】:

    请参阅此documentation 了解可用选项。

    Zend_Application 将自动引导 application.ini 中以资源开头的任何内容。

    请注意,如果你没有在你的 ini 文件中放一些东西,它就不会被加载。例如。默认情况下不加载布局。如果您包含以下一项或两项,则将为应用程序启用布局:

    resources.layout.layoutPath = APPLICATION_PATH "/layouts"
    resources.layout.layout = default
    

    最重要的是,它会在你省略值的地方加载默认值,让我解释一下:默认情况下,引导程序不会有可用的视图资源,因为在 ini 中没有设置任何视图资源。但是如果你把它放在ini中:

    resources.view[] =
    

    然后你可以调用:

    $this->boostrap('view');
    $view = $this->boostrap()->getResource('view');
    

    然后您可以从引导程序中对您的应用的视图执行某些操作,例如

    $view->doctype("HTML5");
    

    另外,您的 _initAutoload 不再需要,可以替换为

    appnamespace = ""
    

    在 .ini 中。我同意 bootstrapping 和 ini 选项的文档记录很差。

    /////////////////////////////////////// /////////////////////////////

    其他动手学习:

    protected function _initIniDump()
    {
        $ini = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', 'development');
        Zend_Debug::dump($ini->toArray(), 'APPLICATION.INI');die();
    }
    

    在该转储中,您将看到 Zend 将遍历资源数组,它识别的任何内容,它都会尽其所知加载

    :)

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      我发现:调用 $this->boostrap('resource');如果 'resource' 不在 application/configs/application.ini 文件中,则不会工作。所以我对你的问题的回答是'是',你必须在 application.ini 文件中定义布局资源,如下所示:resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" (或另一个目录。)

      不幸的是,我认为 zend 框架文档真的很糟糕。尤其是在这个话题上。

      我的意见是,如果你想深入了解 Zend 框架的细节和工作原理,你应该等待一个文档更好的版本(或者如果你有时间,你可以查看 Zend 库类的源代码)。

      【讨论】:

      • 是的,在这种情况下,ZF 手册只是一堆废话,没有示例。特别糟糕。我希望很快会有一些教程/或更好的手册。
      • ZF 手册有时有点蹩脚,有点像维基/教程。但是,如果您继续阅读并继续使用 ZF 进行编程,最终您会了解您使用的所有部分 - 至少对我来说是这样。文档涵盖了大部分内容,但它们分散在各处。因此,确实需要大量的曝光和摆弄才能更深入地了解正在发生的事情。祝你好运!