我已经构建了自己的 MVC 框架,但我仍然在思考一些事情。
我有一个类来处理会话方法,例如刷新会话、验证会话、启动会话、关闭会话。
我的问题是我应该在我的 MVC 架构中在哪里声明它?
- 我有一个抽象基类,由控制器扩展。
- 然后这个基类声明模型和视图。
它应该进入基类吗?如果是这样,我如何从模型中引用会话对象方法?还是我应该只从控制器触发它?
我也是面向对象的 php 新手,这使得这变得更加困难。我的脑子好晕!!
我已经构建了自己的 MVC 框架,但我仍然在思考一些事情。
我有一个类来处理会话方法,例如刷新会话、验证会话、启动会话、关闭会话。
我的问题是我应该在我的 MVC 架构中在哪里声明它?
它应该进入基类吗?如果是这样,我如何从模型中引用会话对象方法?还是我应该只从控制器触发它?
我也是面向对象的 php 新手,这使得这变得更加困难。我的脑子好晕!!
思考涉及 OO 的问题的最佳方式是考虑以下简单问题:
对 1 回答“是”,对 2 回答“否”通常(99% 的时间)表明模特的角色。对 1 表示“否”,对 2 表示“是”表示一个控制器,而对 1、2 表示“否”,对 3 表示“是”表示一个视图。
回答以下突出显示不一致或缺乏分离:
在您的情况下,会话是为客户保留的状态的表示。因此它只能修改自己,而不能作用于其他任何东西。它是一个模型,最好用一个模型来表示。
顺便说一句,理想情况下,您应该创建一个会话存储控制器/对象/助手(取决于框架)来插入、恢复和更新会话模型。这类似于数据提供者。
请求对象最好被认为是,或者至少被写成模型层的一部分,但是因为您是为 Web 编写的,所以请求对象是框架核心的一部分。
但要澄清:
实际上,Session 类是一种数据模型,有人可能会争辩说它是更大的请求模型子集的一部分。请记住,MVC 并不意味着每个请求都需要一个控制器、视图和“模型”。
特别是模型位是一个层。它可以包含服务、数据模型、ORM、助手以及您拥有的...
也就是说,所有处理请求的东西都应该在控制器中准备好。这就是大多数 FW 的工作方式。检查一个请求的 symfony 工作流程,并注意控制器和请求之间的距离。
此图虽然处理 ZendFW 循环,但更清楚地显示了请求对象的特殊状态:
服务器接收请求,框架启动并将请求倒入相应的对象中。
然后,在将请求解析到给定控制器和控制器操作的代码中,我会将所需的请求对象传递给控制器的构造函数。
一个基本的示意图是:
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 编写的,所以请求对象是核心的一部分你的框架。
控制器应该处理这个。
当您需要在会话中设置变量、刷新事物时,控制器将根据您的后端函数的结果来完成。这样您就不必在每个服务、后端或 utils 类中导入此会话类,并且它将始终在相同的编码级别以相同的方式完成。