我在哪里放一个MysqL_query?
我应该将它放在控制器中并在基于提供的查询返回数据的模型上调用方法吗?或者我应该把它放在模型本身?这两种选择我都提供完全垃圾吗?
你可能已经列出了你正在阅读的书籍,因为大多数(如果不是全部)涉及MVC的书籍都是错误的.
如果你想成为一个更好的开发者,我建议你从Marting Fowler – GUI Architectures的文章开始.接着是同一本书的作者–“Patterns of Enterprise Application Architecture”.然后下一步将是你研究SOLID principles并理解如何编写代码在Law of Demeter之后.这应该涵盖基础=]
我可以在PHP中使用MVC吗?
并不是的.至少不是经典的MVC,因为它是defined for Smalltalk.
相反,在PHP中,您有另外4个针对相同目标的模式:MVC Model2,MVP,MVVM和HMVC.再说一次,我懒得再写一次差异,所以我只是链接到我的old comment.
什么是模特?
首先要注意的是MVC中的Model不是类或对象.它是一个包含多个类的层.基本上模型层是所有层组合的(但是,第二层应该称为“域对象层”,因为它包含“域模型对象”).如果您想阅读有关模型层各部分所包含内容的快速摘要,可以尝试阅读this old comment(跳到“侧注”部分).
该图片取自Fowler网站上的Service Layer文章.
控制器做什么?
Controller在MVC中有一个主要职责(我将在这里讨论Model2实现):
Execute commands on structures from model layer (services or domain objects),which change the state of said structures.
它通常具有次要责任:将结构从模型层绑定(或以其他方式传递)到视图,但如果您遵循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);
如您所见,域对象甚至不知道它存储的信息.并且它都没有关于您放置数据的位置.它可以存储在MysqL或Postgresql或某些nosql数据库中.或者可能推送到远程REST API.或者也许映射器是用于测试的模拟器.要替换映射器,您需要做的就是为不同的工厂提供此方法.
另外,请看这些相关的帖子:
> understanding MVC Views in PHP
> testable Controllers with dependencies
> how should services communicate between each other?
> MVC for advanced PHP developers