Zend框架应用程序设计——应该在模型层访问会话变量吗?


Zend Framework application design - should session variables be accessed in the Model layer

我正在研究这个在模型层访问会话变量的应用程序。这似乎是错误的,但我愿意被证明是错误的。也许没有错,但在应用程序的大多数地方,会话变量在控制器中处理并作为参数传递,但在其他地方,会话值只是访问。我说这是不好的练习,我说错了吗?

编辑:我不喜欢模型中的会话的一个原因是,它似乎使测试变得更加复杂。将其作为传递给函数的参数,然后将记录集传递回来。

thx

看情况。

我是这样想的:

    一个模型代表你的数据层。
  1. 大多数情况下,数据层将基于DB表
  2. 会话只是另一个数据存储介质。
  3. 结论:如果你的模型代表的数据存储在会话中,那么从模型
  4. 中访问该数据是OK的
一个例子是基于会话的购物车。购物车的对象是会话数据的模型。

控制器应该在使用使用该会话的模型之前检查会话是否存在。

不应该。存储类型应该与业务逻辑分开。例如:

我有一个简单的插件,它执行访问检查并将用户对象放在注册中心。因此,模型可以访问定义良好的注册表,而不是访问会话。

$User = Zend_Registry::get('User'); // User model object

从理论的角度来看,一切都应该通过数据映射器来访问。将来,如果您将会话存储更改为其他存储,则只需要在一个地方更新它。您的模型不需要知道数据来自何处。

如果您使用多个路径来获取数据,当您的应用程序变大时,可能会导致一些问题。

面向对象和分层系统方法的建议是创建专门的对象和层,并保持事情简单,防止特定的操作分布在整个代码中。

但是,你不需要改变它,除非你看到好处。请记住,有时候重构比试图预测一切更有效。

会话变量中存储了什么?如果只是"登录"?Y/N',那么它们可能不需要成为模型层的一部分。然而,如果它比这更复杂,它们可能与你的商业模式有着不可分割的联系,应该这样对待。

Zend Test文档底部的示例展示了如何使用登录函数测试完整的MVC。想必您在测试模型时也可以这样做吧?