2

我已经构建了自己的 MVC 框架,但我仍然在思考一些事情。

我有一个类来处理会话方法,例如刷新会话、验证会话、启动会话、关闭会话。

我的问题是我应该在我的 MVC 架构中在哪里声明它?

  • 我有一个抽象基类,由控制器扩展。
  • 然后这个基类声明模型和视图。

它应该进入基类吗?如果是这样,我如何从模型中引用会话对象方法?还是我应该只从控制器触发它?

我也是面向对象的 php 新手,这使得这变得更加困难。我的脑子好晕!!

4

3 回答 3

3

思考涉及 OO 的问题的最佳方式是考虑以下简单问题:

  1. 你的对象是某种事物的代表吗?
  2. 它真的要修改其他表示吗?
  3. 它纯粹是为了展示吗?

对 1 回答“是”,对 2 回答“否”通常(99% 的时间)表明模特的角色。对 1 表示“否”,对 2 表示“是”表示一个控制器,而对 1、2 表示“否”,对 3 表示“是”表示一个视图

回答以下突出显示不一致或缺乏分离:

  1. 是 - 是 - 否 - 您的模型没有明确分开
  2. 是的 - 是的 - 是的 - 你实际上有一个对象试图做所有事情
  3. 是 - 不 - 是 - 你的视图和模型没有分开

在您的情况下,会话是为客户保留的状态的表示。因此它只能修改自己,而不能作用于其他任何东西。它是一个模型,最好用一个模型来表示。

顺便说一句,理想情况下,您应该创建一个会话存储控制器/对象/助手(取决于框架)来插入、恢复和更新会话模型。这类似于数据提供者。

于 2013-11-13T12:43:31.940 回答
3

请求对象最好被认为是,或者至少被写成模型层的一部分,但是因为您是为 Web 编写的,所以请求对象是框架核心的一部分。
但要澄清:

实际上,Session 类是一种数据模型,有人可能会争辩说它是更大的请求模型子集的一部分。请记住,MVC 并不意味着每个请求都需要一个控制器、视图和“模型”
特别是模型位是一个层。它可以包含服务、数据模型、ORM、助手以及您拥有的...

也就是说,所有处理请求的东西都应该在控制器中准备好。这就是大多数 FW 的工作方式。检查一个请求的 symfony 工作流程,并注意控制器和请求之间的距离。
此图虽然处理 ZendFW 循环,但更清楚地显示了请求对象的特殊状态:

ZFW 请求周期

服务器接收请求,框架启动并将请求倒入相应的对象中。
然后,在将请求解析到给定控制器和控制器操作的代码中,我会将所需的请求对象传递给控制器​​的构造函数。
一个基本的示意图是:

Request ===> index.php (startup script)
         ||
         || some basic checks, create objects
         ||
         |_==> create base controller
                       ||
                       ||
                       |_==> pass request to constructor, or starter method
                             Do more specific/targetted checks
                                   ||
                                   ||
                                   \/
                        controller has access to request through base controller
                               and can pass this through to the model layer

因此,在恢复中,并且因为我相信重复有效:最好将请求对象考虑或至少编写为模型层的一部分,但是因为您是为 Web 编写的,所以请求对象是核心的一部分你的框架。

于 2013-11-13T13:08:31.673 回答
-2

控制器应该处理这个。

当您需要在会话中设置变量、刷新事物时,控制器将根据您的后端函数的结果来完成。这样您就不必在每个服务、后端或 utils 类中导入此会话类,并且它将始终在相同的编码级别以相同的方式完成。

于 2013-11-13T12:41:20.243 回答