理论
在宏观设计级别,MVC 是一种架构决策,它表明开发中必须分离三个概念。模型、视图和控制器。
为避免在 SO 上出现更多“MVC 理论”重复,这是一个非常受欢迎的答案,其中解释了 MVC 的基础知识:https://stackoverflow.com/a/5864000/1311025
MVC 的实现
您必须选择适合您的项目要求和变更观点的实施。
例如。如果我认为我的数据库将来会改变(我不知道什么时候,我只是怀疑它会改变),我会做一个完全解耦我的数据库的实现,creating a layer that abstracts the implementation of it from the controller. 并实现一个工厂,为你提供访问数据库的正确实例。
如果我认为我的视图会改变,那么我将在视图中使用观察者模式来解耦控制器和视图。控制器和视图将通过事件进行通信。
然后,您可以按照满足您需求的软件设计模式构建您自己的 MVC 实现。
现在,根据您提供的代码,
<?php
$model = new Model();
$controller = new Controller($model);
$view = new View($controller, $model);
if (isset($_GET['action']) && !empty($_GET['action'])) {
$controller->{$_GET['action']}();
}
echo $view->output();
思想是在类(模型、视图和控制器)中分离职责,对我来说,这是一个将视图与模型耦合的示例。但如果我们希望视图、控制器和模型永远像这样并且永远不会改变,那可能是对的。
同样通过这种实现,控制器具有一个状态,这反映了这将永远不会扩展(或者不是以简单的方式)。
免责声明:这是我为一个简单、快速和小项目的实现。
如果您需要一个更严肃的解决方案,而质量不是一个选项,
那么您必须遵循更严格的准则。
在我看来,我会选择至少将视图与模型分离。
<?php
$controller = new Controller();
if (isset($_GET['action']) && !empty($_GET['action'])) {
$controller->doAction($_GET['action']);
}
控制器不必处理全局 php 变量($_GET):
<?php
Controller {
public function __construct() {}
public function doAction($action) {
$model = new User();
$model->setName("user36279");
//This just transforms the user model in an associative array
$UserDTO = $model->toDTO();
$view = new UserView();
//We don't send the model to the view increasing decoupling
$view->render($UserDTO);
}
}
但这将是我的实现。现在由您来决定要解耦多少,想要多少可维护性、复杂性和可测试性。
编辑:
有人指出:
[...] 你的“控制器”实际上负责路由、检索
来自模型层的信息和响应的呈现,其中
当然违反了 SRP 和 SoC。底线:所有这些都是
完全错误
他是对的,我的代码违反了 SRP。但是看看这个问题:
Does the traditional use of the controller in MVC lead to a violation of the Single Responsibility Principle?
如果你想遵循 SRP,你可以分解你的控制器
进入 Dispatcher 和 Actions; Dispatcher 调度控制到
它的行动[...]
为什么我们不经常看到这种情况?因为控制器通常是“广告
hoc" 实现,不是叶级的具体类
泛化,并不意味着被子类化。这里使用了类
更方便地对代码进行分组,操作几乎可以肯定
非公开的(可能是私有的,可能是受保护的),“仅仅是”内部的
实现细节。
选择如何决定调度什么动作,数量和
可能动作的多样性,高,调度和动作是
紧密耦合。 因此,在实践中,将
在一个地方一起编码。
SOLID 原则是设计面向对象的重要指南。这里的一般规则是承认不同的选择并选择最适合您需求的选择。原则是指导方针而不是规则,遵循原则的主要优势是一组通用的解决方案,这些解决方案与语言无关,对于新手和专家开发人员来说都易于使用和理解,并且我们的设计简单。
底线:何时需要应用 SRP(单一责任原则)并因此应用 SOLID,取决于您。