MVC 和程序状态 - 模型应该是愚蠢的吗?

lon*_*oat 1 php model-view-controller paradigms session-variables

我正在使用一个使用 MVC 范例的框架。它是 CodeIgniter,但我的问题并不是专门针对该框架 - 更普遍的是关于使用 MVC 时的最佳实践。

我使用 $_SESSION 变量来维护一些状态变量(用户选择、一些临时首选项、一些数据过滤选项)。这很容易做到,但我发现我在模型和控制器之间分割了这些变量的使用。有时我会更新控制器中的一个,并在模型中查找它。这开始“闻起来”很有趣,因为我突然想到让模型“意识到”所有这些设置可能不是一个好主意。模型不应该只接受获取/操作数据的请求,并且只关心请求中明确的内容(而不必查找外部变量)吗?

下面是一个示例: 我有一个名为 $_SESSION['regionFilter'] 的会话变量。这是在控制器中创建和更新的,代表用户想要“向下钻取”的销售区域。当控制器从模型请求一些数据时,我当前让模型查找 $_SESSION['regionFilter'] 变量,并在为数据库创建 SQL 时使用它。似乎让模型在程序状态方面变得“哑”,并且让控制器以某种方式将 $_SESSION['regionFilter'] 变量捆绑到其请求中(如果需要的话)可能更有意义。

有什么想法吗?谢谢!


编辑: 谢谢大家的讨论。我知道重叠的问题,但很难找到有关该主题的一般性讨论 - 我搜索“MVC 模型程序状态”时发现了许多有关 ASP.NET-MVC 特定讨论的问题,这些问题在实现中陷入困境细节。

我已将问题标记为已关闭。再次感谢您的想法!

Moo*_*ice 5

我认为你担心它闻起来很奇怪是完全正确的。您刚刚向模型中引入了一些与模型无关的内容。

我不认为向模型提供过滤器有什么问题,也许需要一个代表您所在区域的字符串。如果您想将会话传递给它,那么请随意,但是通过将会话内容(甚至读取)放入 Model 中,您已经在本质上将两者联系起来......模型到会话状态。

在模型中提供一个将进行适当过滤的方法,然后无论如何从控制器传递会话变量,但模型不知道过滤器来自会话变量。这只是一个过滤器。

编辑:为了澄清,我想说会话状态是控制器的一部分,绝对不是模型的一部分