2009-07-02 2 views
13

Я начинаю с Zend Framework и хочу понять файл Bootstrap. Я узнал, что все методы _init выполняются по умолчанию, но мне кажется, что это путает. Во всяком случае, это не то, что я хотел бы спросить.Zend Framework Layout

A пришел вокруг действия $this->bootstrap('layout');, и я не уверен, если я это понимаю. Является ли это переменной resource.layout в файле application.ini? Я бы очень хотел понять процесс бутстрапа в глубине.

Я прошу вас дать пошаговое объяснение. Спасибо заранее!

Так что это мой загрузочный файл:

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'); 
    } 
} 
+0

Только что связанный с этим вопросом на моем ленте twitter https://twitter.com/joedevon/status/2464729062, надеюсь, кто-то появится в ближайшее время с хорошим подробным объяснением. Я получил его полностью, но не понимаю все, что он делает :) – joedevon

+0

$ this-> bootstrap ('layout'); Эта строка гарантирует, что «макет» был настроен до запуска остальной _initViewHelpers(). – berty

ответ

1

Я обнаружил, что: вызов $ this-> boostrap ('ресурс'); не будет работать, если «resource» не находится в файле application/configs/application.ini. Таким образом, мой ответ на ваш вопрос будет «да», вы должны определить ресурс макета в файле application.ini со следующим: resources.layout.layoutPath = APPLICATION_PATH «/ layouts/scripts» (или другой каталог)

К сожалению, документация по zend Framework на самом деле плохой. Особенно на эту тему.

Мое мнение, что вы должны дождаться версии с лучшей документацией, если хотите углубиться в детали и работу Zend Framework (или вы можете проверить исходный код классов библиотеки Zend, если у вас есть время).

+2

Да, в этом случае руководство ZF просто загружает дерьмо и никаких примеров. Действительно плохо. Надеюсь, что в скором времени или в руководстве будет проведено несколько учебных пособий. –

+2

Руководство ZF немного устарело и похоже на вики/учебник. Однако, если вы продолжаете читать и занимаетесь программированием с помощью ZF, вы, в конце концов, понимаете все части, с которыми работаете. По крайней мере, так оно и было для меня. Документы охватывают большинство вещей, но они разбросаны здесь и там. Поэтому для получения более глубокого понимания того, что происходит, требуется много разоблачения и возиться. Удачи! –

2

см. Здесь documentation для имеющихся опций.

Zend_Application автоматически загрузит что-либо в application.ini, которое начинается с ресурсов.

Обратите внимание, что если вы не поместите что-то в свой ini-файл, он не будет загружен. Например. по умолчанию макет не загружается. Если включать либо один или оба из следующих макета будет включена для приложения:

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

Самое главное, чтобы понять, что она будет загружаться по умолчанию, где вы опущенные значения, позвольте мне объяснить: К default bootstrap не будет иметь доступ к ресурсу вида, потому что ни один из них не установлен в ini. Но если вы поставите это в INI:

resources.view[] = 

, то вы можете позвонить:

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

Затем вы можете сделать что-то с точки зрения вашего приложения от начальной загрузки, например,

$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 будет перебирать массив ресурсов, все, что он признает, он загружает лучше всего из его знания

:)

Надежда, что помогает.

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 

Обратите внимание, что вы можете столкнуться с 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 

Надеется, что это более ясно.