Как я могу заполнить переменные Zend_Layout внутренними данными?

Когда я пытаюсь придерживаться устоявшихся передовых методов, таких как избегание одиночных разрядов, реестра, статических свойств и базовых контроллеров, как я могу заполнить свой макет (и частичные данные, используемые макетом) данными, которые используются только макетом и являются общими для всех действий?

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

Использование плагина фронт-контроллера просто невозможно без использования одноэлементной "функции" в Zend_Layout. Плагин знает только объект запроса и ответа и не имеет доступа к контроллерам, представлениям или макету.

У помощников действий Zend есть методы init/preDispatch/postDispatch. Можно добавить помощники действий в HelperBroker (например, с помощью начальной загрузки), и они будут выполняться в обычном потоке приложений.

Использование метода init для ввода данных в представление невозможно, так как оно срабатывает до готовности контроллера / представления. preDispatch / postDispatch возможен, но не идеален, так как эти методы всегда запускаются при выполнении действия контроллера.

Это означает, что все использования Zend_Controller_Action::_forward() также будут выполнять preDispatch / postDispatch во всех помощниках действий. Это не имеет большого значения для кода, кроме скорости, я действительно не хочу устанавливать переменную вида (или помощника вида) несколько раз. Можно обойти эту проблему, используя какую-то переменную $firstRun, но я действительно не хочу отслеживать это в моем собственном коде.

Другой метод делает это в начальной загрузке, но, на мой взгляд, это действительно не относится к этому.

Итак, как я могу заполнить свой помощник по макету / представлению данными из базы данных, делая это только один раз и при этом сохраняя хорошее разделение интересов?

3 ответа

Вы могли бы пойти с Action Helpers, как указано в этом ответе (посмотрите на вопрос тоже, он очень похож на ваш)

Я бы тоже использовал помощников действий. Просто заполните переменные вида и отобразите их, используя обычный PHP/partials/render/viewHelper (в зависимости от сложности).

Ваша проблема с несколькими прогонами с использованием preDispatch может быть решена с помощью

if (!($this->view->myVar)) { // or array_key_exist or isset - depending on your use case
    $this->view->myVar = $someModel->getSomeData();
}

Что просто отлично, ИМО.

Я следовал за ActionHelper подход, устанавливая переменные представления на preDispatch метод. Это было самое логичное место, на мой взгляд. Кроме того, мои проекты не использовались Zend_Controller_Action::_forward(), поэтому у меня не было никаких проблем со скоростью из-за многократного запуска помощника.

Надеюсь, это поможет,

Другие вопросы по тегам