Как я могу заполнить переменные 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()
, поэтому у меня не было никаких проблем со скоростью из-за многократного запуска помощника.
Надеюсь, это поможет,