PHP MVC 和 SQL 减去模型

标签 php sql model-view-controller

我阅读了几篇有关 MVC 的文章,并有一些问题希望有人能帮助我回答。

首先,如果MODEL是数据的表示以及操作该数据的方法,那么使用通用接口(interface)的具有一定抽象级别的数据访问对象(DAO)就足够了对于大多数任务不应该吗?

为了进一步阐述这一点,假设我的大部分开发都是使用 MySQL 作为数据的底层存储机制来完成的,如果我在构建 SQL 语句时避免使用供应商特定的函数(即 UNIX_TIMESTAMP),并且使用了一个抽象的 DB 对象,该对象具有在 MySQL 和 PostgreSQL 或 MySQL 和 SQLite 之间移动的通用接口(interface),这应该是一个简单的过程。

这是我在某些任务中得到的结果,由单个 Controller 处理——(即用户注册),而不是为该任务创建一个模型,我可以获取 db 对象的实例(即 DB::getInstance()),然后进行必要的 db 调用以 INSERT 一个新用户。为什么对于如此简单的任务我要创建一个新的模型

在一些示例中,我看到创建了一个 MODEL,并且在该 MODEL 中有一个 SELECT 语句,该语句从订单表中获取 x 个订单,并且返回一个数组。如果在您的CONTROLLER中创建另一个循环来迭代该数组并将其分配给VIEW,为什么要这样做?前任。 1?

ex. 1: foreach ($list as $order) { $this->view->set('order', $order); }

我想人们可以修改返回值,所以这样的事情是可能的;前任。 2.

ex. 2: while ($order = $this->model->getOrders(10)) { $this->view->set('order', $order); }

我想我的论点是,当您可以简单地从 CONTROLLER 中进行必要的数据库调用时,为什么要创建模型,假设您使用具有通用接口(interface)的数据库对象来访问数据,正如我所言怀疑大多数网站都在使用。是的,我不认为这对所有任务都是实用的,但同样,当所做的大部分事情都足够简单时,不一定需要单独的模型

就目前而言,用户发出请求“www.mysite.com/Controller/action/args1/args2”,前端 Controller (我称之为路由器)传递到 Controller (类),并在该 Controller 内调用特定的操作(方法),并从那里创建适当的VIEW,然后输出。

最佳答案

所以我猜您想知道在数据库访问对象之上增加模型层的复杂性是否是您想要的方式。根据我的经验,简单性胜过任何其他问题,所以我建议,如果您看到一个明确的情况,即完全没有模型并且在相当于 Controller 的情况下进行数据访问会更简单,那么您应该这样做。

但是,MVC 分离还有其他潜在的好处:

  • Controller 中根本没有 SQL:也许您决定从数据库以外的源收集数据( session 中的数组?用于测试的模拟对象?文件?只是其他东西),或者您的数据库架构更改,并且您必须查找代码必须更改的所有位置,您可以仅查看模型。
  • 技能组分离:也许您团队中的某个人擅长复杂的 SQL 查询,但不擅长处理 php 方面。那么代码越分离,就越多的人可以发挥自己的优势(在 html/css/javascript 方面更是如此)。
  • 表示数据 block 的概念对象:正如 Steven 所说,与数据库无关(因此您可以根据需要在 mysql 和 postgresql 之间切换)和架构 不可知的(因此您拥有一个充满数据的对象,即使它来自不同的关系表,也可以很好地组合在一起)。当您拥有代表良好数据 block 的模型时,您应该能够在多个地方重用该模型(例如,可以在登录和显示人员列表时使用人员模型)。

我当然认为 MVC 的任务分离理念非常有用。但随着时间的推移,我开始认为替代风格,例如保持类似 MVC 的分离与函数式编程风格,可能比成熟的 OOP MVC 系统更容易在 php 中处理。

关于PHP MVC 和 SQL 减去模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1313311/

相关文章:

javascript - 如何从 URL 中提取 JSON 数据

php - jqgrid 编辑操作如何将变量发送到服务器?

mysql - 如何将我的 'view' 存储为 mySQL 中的永久表?

c# - 使用 c# 和 MySql 存储过程找出 Last_Insert_Id() (在数据访问层 MVC 中)

javascript - Angular JS Json 数据

php - 以另一个用户身份执行脚本

php - 为什么 Wordpress 代码始终具有不常见的 "boolean literal === some dynamic expression"比较部分顺序?

mysql - 根据当前日期对即将到来的生日进行排序

c# - 编译查询失败 - 查询是针对与指定 DataContext 关联的映射源不同的映射源编译的

javascript - 类似 MVC 的代码如何在 Node.js 中工作?