您应该在控制器中处理会话数据还是在 MVC 框架的模型中处理会话数据?

Posted

技术标签:

【中文标题】您应该在控制器中处理会话数据还是在 MVC 框架的模型中处理会话数据?【英文标题】:Should you handle session data in a controller or a model for an MVC framework? 【发布时间】:2012-07-18 01:09:54 【问题描述】:

我正在使用 MVC 框架(特别是 php 的 CodeIgniter)。我试图尽可能地遵循“最佳实践”,但我对 MVC 没有太多经验。从控制器中的会话中检索数据对我来说是不好的做法吗?我应该“询问”模型,比如说,一个特定的会话值是 'foo' 还是 'bar',还是应该直接在 Controller 中这样做?我想我应该在模型内部进行,因为会话数据在技术上是数据,但我只是想确定一下。需要明确的是,我根本不将会话数据存储在数据库中,所以我没有运行查询。

【问题讨论】:

【参考方案1】:

模型通常处理持久化到某种长期存储的所有域对象。它们中可能有也可能没有与特定应用程序对它们的使用有关的瞬态值。

控制器应该查询他们需要的任何数据,以便正确路由和显示信息。它可能有助于创建一个直接在域对象(您的模型)上操作的“服务”层,并提供一个供控制器使用的 API。控制器中不包含的主要内容是业务逻辑。

例如,对于控制器来说,获取引用页面并对用户流相关的数据进行处理是合理的。然而,除了验证之外,它可能不应该检查账户之间转移的金额——它应该只是将其传递给一个服务对象,该服务对象实例化并使用正确的域对象。

关于您要放入控制器的逻辑的问题:

此逻辑是否有助于确定我需要哪些模型对象?如果没有,它不应该在这里。 此逻辑是否有助于确定将使用哪些 View 对象来构造对用户的响应?如果没有,它不应该在这里。

【讨论】:

Nathaniel,所以如果我从数据库中选择要在页面上显示的内容,那应该在控制器内完成吗?无关,但很有帮助。 否;持久化到任何类型的存储(包括数据库)的任何对象都是域对象。如果您将某些内容存储到数据库中,则模型/服务层应该获取该信息。控制器只是将该信息传递给正确的视图。 +1 表示“某种长期存储”。这就是我想说的。 Session 是 CodeIgniter (CI_Session) 中的一个库,可以直接从类实例中访问会话数据。 仅供参考,CI_Session 数据的大小限制为 4k,因为它使用 cookie 而不是 PHP 的本机会话。 @ChrisC 默认是。但是您可以将其更改为使用本机会话。有很多实现可以解决这个问题。只需将其中一个 MY_Session 放入您的应用程序/库中

以上是关于您应该在控制器中处理会话数据还是在 MVC 框架的模型中处理会话数据?的主要内容,如果未能解决你的问题,请参考以下文章

我在 asp.net MVC 中进行会话处理它在查看页面按钮上工作我无法在我的控制器中的另一个操作上获得会话 [重复]

为啥 auth 通常在 MVC 的 Controller 中?

我应该从 MVC 框架中的控制器或模型中调用 redirect() 吗?

使用 WIF 和 jquery ajax 请求时 ASP.NET MVC 3 中的会话 Cookie 过期处理

asp.net mvc框架优缺点

django:胖模型和瘦控制器?