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