在 Web 应用程序中分离关注点并使代码可重用的最有效模式是什么?
没有经过验证的模式。当您想到这一点时,您可能希望减少代码重复(尤其是在 Views 中&&
)并尽可能使您的代码可读可维护。
这是数据抽象的问题
事实上,根据它的定义,它引导你以正确的方式思考类似的事情。
我不仅希望看到对这种模式的描述,还希望看到一个简短的代码示例,以便我更好地理解它。
首先 - 继承是要走的路,直到它同时满足Liskov 替换原则和单一责任原则。
如上所述,没有经过验证的模式,但有一种经过验证的技术。
在 PHP 世界中,您的MVC/MVVM
应用程序必须至少实现:
- PSR-0 自动装载机
- 路由器+调度程序(有点前端控制器)
要记住的常见事项:
1.模型是一个抽象层(在MVC/MVVM/MVP中)
它由许多处理应用程序核心逻辑的类组成。如果你调用一个对象Model
,那么你最终会违反单一责任原则。
错误的实现:
让我们想象一下,那个模型是一个类,
由于在大多数情况下我们处理表单,我们基本上想要:
- 有效的表格
Insert/Update/..
如果记录有效,则
所以,这个的“模型”看起来像这样:
$model = new RegisterForm(...);
if ($model->isFormValid($formData)) {
if ($model->insertRecord($formData)) {
echo 'Thanks for registration';
}
}
这显然破坏了SRP。如果你从那里继承,也许是LSP 。
正确实现:
由于模型是一个层,那么它应该如下所示:
模型层的文件夹结构类似于
/User/Login
- FormValidator.php
- FormValidatorInterface.php
- RecordManager.php
从那时起,用法本身就是:
$formValidator = new User_Login_FormValidator(...);
if ($formValidator->isValid(..form data..)) {
$recordManager = new User_Login_RecordManager($pdo);
if ($recordManager->insert(..form data..)) {
echo 'Logged in';
}
} else {
print_r($formValidator->getErrors());
}
现在让我们分解一下,
当您的模型是图层时:
当您的模型是对象时,例如FooModel
:
- 你做错了——你把一个概念和一个实现混在一起
- 你最终违反了 SRP 和 LSP
2.什么是真正的MVC?
如您所知,它由 3 个组件组成,但不是对此进行讲座,而是让我们看一下
还要注意,
你不应该echo/print
从课堂上得到任何东西。绝不!这应该在三合会之外完成,像这样,
$modelLayer = new ModelLayer(...);
$view = new View($modelLayer, $controller);
$controller = Controller($modelLayer);
$controller->indexAction($_POST[...])
echo $view->render(); // render() should `include()` and capture (via ob_* functions) a HTML template.
3.什么不是MVC?
这里有一系列错误的想法,你也应该记住,你会一遍又一遍地遇到:
“通用工作流程”为
<?php
$model = new Model();
$view = new View();
$controller = new Controller($model, $view);
$controller->indexAction();
4. MVVM 怎么样?
这是一篇给你的好文章,它解释了它。请注意,他命名一个类Model
只是为了演示。