5

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

典型的场景是建立在可变数据上的菜单,比如数据库。牢记关注点分离,视图/布局不应该直接与后端对话,而是被告知要包含什么。

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

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

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

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

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

那么,我怎样才能用数据库中的数据填充我的布局/视图助手,只做一次并且仍然保持良好的关注点分离?

4

3 回答 3

0

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

希望有帮助,

于 2012-05-15T14:07:30.030 回答
0

您可以按照此答案中的说明使用 Action Helpers (也可以查看问题,它与您的问题非常相似)

于 2012-05-15T18:00:02.833 回答
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();
}

这很好海事组织。

于 2012-05-15T18:21:07.697 回答