如何使用后端数据填充Zend_Layout变量?

时间:2012-05-15 12:11:48

标签: php zend-framework zend-layout

当尝试遵循既定的最佳实践,例如避免单例,注册表,静态属性和基本控制器时,我如何使用仅由布局使用的数据填充我的布局(以及布局使用的部分),并在所有布局中使用操作

典型的场景是基于可变数据的菜单,如数据库。考虑到关注点的分离,视图/布局不应该直接与后端对话,而应该告诉要包含的内容。

如果不使用Zend_Layout中的单例“功能”,则无法使用前端控制器插件。该插件只知道请求和响应对象,也无法访问控制器,视图或布局。

Zend的动作助手有init / preDispatch / postDispatch方法。可以向HelperBroker添加动作助手(例如使用引导程序),这些将在正常的应用程序流程中执行。

使用init方法将数据注入视图是不可能的,因为它在控制器/视图准备好之前被触发。 preDispatch / postDispatch是可能的,但并不完美,因为这些方法在执行控制器操作时始终触发

这意味着Zend_Controller_Action :: _ forward()的所有使用也将在所有动作助手中执行preDispatch / postDispatch。除了速度之外,这对代码没有任何重大影响,我真的不想多次设置视图(或视图助手)变量。可以使用某种$ firstRun变量来解决这个问题,但我真的不想在我自己的代码中跟踪它。

另一种方法是在引导程序中执行此操作,但在我看来它确实不属于那里。

那么,我如何使用数据库中的数据填充布局/视图助手,只执行一次并仍然保持良好的关注点分离?

3 个答案:

答案 0 :(得分:0)

我遵循了ActionHelper方法,在preDispatch方法上设置了视图变量。在我看来,这是最合乎逻辑的地方。另外,我的项目没有使用Zend_Controller_Action::_forward(),所以我没有关于多次触发助手的速度问题。

希望有所帮助,

答案 1 :(得分:0)

你可以按照answer中的说明去看动作助手(看看这个问题,它与你的问题非常相似)

答案 2 :(得分:0)

我也会使用动作助手。只需填充视图变量并使用普通的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();
}

哪个IMO很好。