ice*_*eea 6 php oop model-view-controller design-patterns
最近几天,我在PHP中广泛阅读有关OOP和MVC的书籍和网页,这样我就可以成为更好的程序员.我对MVC的理解遇到了一些问题:
我在哪里放一个mysql_query?
我应该将它放在控制器中并在基于提供的查询返回数据的模型上调用方法吗?或者我应该把它放在模型本身?这两种选择我都提供完全垃圾吗?
ter*_*ško 15
你可能已经列出了你正在阅读的书籍,因为大多数(如果不是全部)涉及MVC的书籍都是错误的.
如果你想成为一个更好的开发人员,我建议你从Marting Fowler的文章开始 - GUI架构.其次是同一本书 - "企业应用程序架构模式".然后,下一步将是您研究SOLID原理并了解如何编写遵循Demeter法则的代码.这应该涵盖基础=]
并不是的.至少不是为Smalltalk定义的经典MVC .
相反,在PHP中,您有另外4个针对相同目标的模式:MVC Model2,MVP,MVVM和HMVC.再一次,我懒得再一次写下差异,所以我只想链接到我的旧评论.
首先要注意的是MVC中的Model不是类或对象.它是一个包含多个类的层.基本上模型层是所有层组合的(但是,第二层应该称为"域对象层",因为它包含"域模型对象").如果您想阅读有关Model层的每个部分中包含的内容的快速摘要,您可以尝试阅读这个旧注释(跳到"侧注"部分).

该图片来自Fowler网站上的Service Layer文章.
Controller在MVC中有一个主要职责(我将在这里讨论Model2实现):
在模型层(服务或域对象)上的结构上执行命令,这些命令会更改所述结构的状态.
它通常具有次要责任:将结构从模型层绑定(或以其他方式传递)到视图,但如果您遵循SRP,它将成为一个可疑的实践
信息的存储和检索在数据源层处理,通常实现为DataMapper(不要与滥用该名称的ORM混淆).
以下是它的简化使用方式:
$mapper = $this->mapperFactory->build(Model\Mappers\User::class);
$user = $this->entityFactory->build(Model\Entities\User::class);
$user->setId(42);
$mapper->fetch($user);
if ($user->isBanned() && $user->hasBannExpired()){
$user->setStatus(Model\Mappers\User::STATUS_ACTIVE);
}
$mapper->store($user);
Run Code Online (Sandbox Code Playgroud)
如您所见,域对象甚至不知道它存储的信息.并且它都没有关于您放置数据的位置.它可以存储在MySQL或PostgreSQL或某些noSQL数据库中.或者可能推送到远程REST API.或者也许映射器是用于测试的模拟器.要替换映射器,您需要做的就是为不同的工厂提供此方法.
模型和实体类表示应用程序的数据和逻辑,许多人称之为业务逻辑.通常,它负责:
这是MVC序列图,显示了http请求期间的流程:

在这种情况下,Model是实现访问数据库的代码的最佳位置.
| 归档时间: |
|
| 查看次数: |
7019 次 |
| 最近记录: |