Zend框架布局

13

我正在学习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 留言中链接了这个问题 https://twitter.com/joedevon/status/2464729062,希望有人能很快地提供一个好的详细解释。我已经完全让它工作了,但并不完全理解它在做什么 :) - joedevon
$this->bootstrap('layout');这行代码确保在运行_initViewHelpers()的其余部分之前已经设置了“layout”。 - berty
3个回答

6

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

请注意,在尝试执行彼此之前,可能会遇到“循环依赖”错误。
您可以使用任意数量的_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
请参考此文档了解可用选项。
Zend_Application会自动引导以resources开头的任何内容。
请注意,如果您没有在ini文件中放置某些内容,则不会加载该内容。例如,默认情况下不会加载布局。如果您包含以下一个或两个内容,则应用程序将启用布局:
resources.layout.layoutPath = APPLICATION_PATH "/layouts"
resources.layout.layout = default

最重要的是要意识到,当您省略值时,它将加载默认值,让我解释一下:默认情况下,Bootstrap不会提供视图资源,因为ini文件中没有设置。但是,如果您在ini文件中添加以下内容:

resources.view[] =

然后你可以调用:
$this->boostrap('view');
$view = $this->boostrap()->getResource('view');

然后,您可以从bootstrap中处理应用程序视图,例如:
$view->doctype("HTML5");

此外,您的_initAutoload现在已不再必要,可以用以下代码替换:

appnamespace = ""

在 .ini 文件中,我认为引导和 ini 选项的文档非常不完善。
////////////////////////////////////////////////////////////////////////////////
另外,对于实践学习:
protected function _initIniDump()
{
    $ini = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', 'development');
    Zend_Debug::dump($ini->toArray(), 'APPLICATION.INI');die();
}

在这个转储文件中,您会看到Zend将遍历资源数组,并加载它所认识的任何东西,并尽最大努力发挥其知识。
:)
希望对您有所帮助。

1

我发现:如果“resource”不在application/configs/application.ini文件中,调用$this->bootstrap('resource')将无法工作。所以我的答案是:“是的”,您必须在application.ini文件中定义布局资源,如下所示:resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"(或另一个目录)。

不幸的是,我认为Zend Framework文档真的很糟糕,特别是在这个主题上。

我的意见是,如果您想深入了解Zend Framework的细节和工作原理,您应该等待具有更好文档的版本(或者如果您有时间,可以查看Zend Library Classes的源代码)。


2
是的,在这种情况下,ZF手册只是一堆废话,没有任何示例。非常糟糕。希望很快会有一些教程/或更好的手册。 - Tomáš Fejfar
2
ZF手册有时有点不够详细,而且有些像维基/教程。但是,如果你不断阅读并使用ZF编程,最终你就会理解你所使用的所有部分——至少对我来说是这样。文档涵盖了大部分内容,但它们分散在各处。因此,需要大量接触和尝试才能更深入地理解发生的事情。祝你好运! - d-_-b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接