Zend_View как ресурс, помещенный в Zend_Registry

#php #zend-framework #bootstrapping #zend-view

#php #zend-framework #загрузка #zend-просмотр #zend-view

Вопрос:

Я хочу поместить Zend_View в Zend_Registry, и у меня возникли проблемы с этой простой задачей. Zend_View инициализируется в application.ini как ресурс:

 resources.view.encoding = "UTF-8"
resources.view.contentType = "text/html; charset=UTF-8"
resources.view.doctype = "HTML4_STRICT"
resources.view.helperPath.ZendX_JQuery_View_Helper = "ZendX/JQuery/View/Helper"
  

Это работает нормально, затем я хотел поместить это в реестр, добавив метод в Bootstrap.php.

 protected function _initView()
{
    $view = $this->getResource('view');
    Zend_Registry::set('view', $view);

    return $view;
}
  

И после обновления я получаю ошибки при инициализации представления:

 Catchable fatal error: Argument 1 passed to ZendX_JQuery::enableView() must be an instance of Zend_View_Interface, null given, called in D:projektyxxxlibraryZendXApplicationResourceJquery.php on line 91 and defined in D:projektyxxxlibraryZendXJQuery.php on line 104
  

Что я делаю не так? Я не получал эту ошибку jQuery раньше

Комментарии:

1. Зачем вам нужно помещать ваш объект view в реестр?

2. Хорошая мысль, Вика, это разрушает идею MVC

3. @jake: Я хочу иметь почтовую программу, которая отображает тело с помощью Zend_View и отправляет его через Zend_Mailer. Что не так с этим подходом?

4. Использовать новый объект Zend_View, а не объект просмотра страницы?

Ответ №1:

Существует два разных способа инициализации ресурса: в файле application.ini и с использованием метода _init в классе bootstrap. При начальной загрузке приложения сначала выполняются методы _init, за которыми следуют ресурсы ini-файла. Итак, проблема с вашим кодом заключается в том, что при $this->getResource('view') запуске ресурс view еще не существует, поэтому это вернет null. Затем вы помещаете это значение null в реестр, которое, предположительно, является причиной ошибки позже.

Не совсем понятно, зачем вам нужен объект view в реестре, поэтому, возможно, если бы вы могли объяснить, что мы могли бы предложить лучший подход.

Ответ №2:

Вызовите свой метод _init как-нибудь иначе … скорее всего, здесь происходит конфликт имен.

 protected function _initViewInRegistry() {
    // run view resource
    $this->bootstrap('view');

    // put view resource in registry
    Zend_Registry::set('view', $this->getResource('view'));
}
  

Это немного некрасиво с точки зрения именования / семантики, возможно, это лучше подходит для ресурса реестра, который полностью настраивает ваш экземпляр реестра.