当尝试遵循既定的最佳实践,例如避免单例,注册表,静态属性和基本控制器时,我如何使用仅由布局使用的数据填充我的布局(以及布局使用的部分),并在所有布局中使用操作
典型的场景是基于可变数据的菜单,如数据库。考虑到关注点的分离,视图/布局不应该直接与后端对话,而应该告诉要包含的内容。
如果不使用Zend_Layout中的单例“功能”,则无法使用前端控制器插件。该插件只知道请求和响应对象,也无法访问控制器,视图或布局。
Zend的动作助手有init / preDispatch / postDispatch方法。可以向HelperBroker添加动作助手(例如使用引导程序),这些将在正常的应用程序流程中执行。
使用init方法将数据注入视图是不可能的,因为它在控制器/视图准备好之前被触发。 preDispatch / postDispatch是可能的,但并不完美,因为这些方法在执行控制器操作时始终触发。
这意味着Zend_Controller_Action :: _ forward()的所有使用也将在所有动作助手中执行preDispatch / postDispatch。除了速度之外,这对代码没有任何重大影响,我真的不想多次设置视图(或视图助手)变量。可以使用某种$ firstRun变量来解决这个问题,但我真的不想在我自己的代码中跟踪它。
另一种方法是在引导程序中执行此操作,但在我看来它确实不属于那里。
那么,我如何使用数据库中的数据填充布局/视图助手,只执行一次并仍然保持良好的关注点分离?
答案 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很好。