gpt4 book ai didi

php - 我应该在 MVC 中的什么地方进行数据库查询?

转载 作者:可可西里 更新时间:2023-11-01 13:03:47 27 4
gpt4 key购买 nike

这几天,我大量阅读了有关PHP中OOP和MVC的书籍和网页,以便成为一名更好的程序员。我在理解 MVC 时遇到了一个小问题:

我在哪里放置 mysql_query

我应该把它放在 Controller 中并在模型上调用一个方法来根据提供的查询返回数据吗?还是我应该把它放在模型本身?我提供的两个选项都是垃圾吗?

最佳答案

关于 MVC 主题的资料

您可以列出您正在阅读的书籍,因为大多数(如果不是全部)涉及 MVC 的 php 书籍都是错误的。

如果您想成为更好的开发人员,我建议您从 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 中的模型不是类或对象。它是一个包含大量类的层。基本上,模型层是所有层的组合(不过,第二层应该称为“领域对象层”,因为它包含“领域模型对象”)。如果您想阅读有关模型层每个部分所包含内容的快速摘要,您可以尝试阅读 this old comment (跳到“旁注”部分)。

Model layer consists of all the 3 concentric circles
图片取自Service Layer Fowler 网站上的文章。

Controller 做什么?

Controller在MVC中的主要职责之一(这里我要讲的是Model2的实现):

Execute commands on structures from model layer (services or domain objects), which change the state of said structures.

它通常有次要职责:将结构从模型层绑定(bind)(或以其他方式传递)到 View ,但如果您遵循 SRP,这将成为一个有问题的做法。

SQL 相关代码应该放在哪里?

信息的存储和检索在数据源层处理,通常实现为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。或者映射器可能是用于测试的模拟。要替换映射器,您需要做的就是为不同的工厂提供此方法。

此外,请参阅这些相关帖子:

关于php - 我应该在 MVC 中的什么地方进行数据库查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10675512/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com