人人都能看懂的全栈开发教程——MVC

人人都能看懂的全栈开发教程——MVC

Chris Yue No Comment
Posts

从这一篇开始,我们即将要接触代码设计相关的话题以及大量的重构。在写这章之前我就有一个草稿,但总觉得我想表达的意思似乎我已经写过了,今天找了一下,还真写过,而且还是 2011 年写的……我也回顾了一下那篇文章,并没有年久失修,不但可以看,而且把我想表达的意思都表达了(好想给自己点赞是怎么回事)。

所以,这篇我就可以偷个懒了,关于 MVC 介绍部分,就看那篇文章就行,说得很详细,不过我还是会把一些重点重复一下,当然我们的例子跟 11 年是不一样的,我会把实例也更新了。

由于昨天我们有说需要重新创建一个 index.php 输出 HTML 代码,我们也说可以暂时直接将 console/list.php 复制过了再做修改。修改之后的代码如下,同样留意代码注释:

<?php
// 注意因为文件放的位置不同,所以下面的代码把 .. 去掉了
$pdo = require __DIR__.'/pdo.php';

$rows = $pdo->query('select * from task');
?>
<!-- 下面这些代码就是直接从 HTML 那章复制过来的 -->
<!DOCTYPE html>
<html>
  <head>
    <title>任务列表</title>
  </head>
  <body>
    <ul>
      <!-- PHP 有一个很独特的,其他语言都没有地方就是,它本身就是一个『模板语言』 -->
      <!-- 这就是为什么 PHP 非要有打开标记,其他语言都没有,就是为了方便在 HTML 代码里混写 PHP -->
      <?php foreach ($rows as $row): ?>
        <li><?= $row['content'] ?></li>
      <!-- 注意这里的 foreach 冒号和 endforeach,它跟之前大括号的写法完全一样,但在模板里建议这么写,比大括号更容易识别,这也是 PHP 作为模板语言的特点 -->
      <?php endforeach ?>
    </ul>
  </body>
</html>

而为了表达 MVC 的『分工』思想,结合我们昨天所了解的 require 的用法,我们将进一步拆分代码:

首先我们创建 tasks.php 来表示我们列出所有任务这一需求:

<?php

$pdo = require __DIR__.'/pdo.php';

return $pdo->query('select * from task');

接着我们需要给做页面的工程师创建 tasks.html.php 即我们的模板页面

<!DOCTYPE html>
<html>
  <head>
    <title>任务列表</title>
  </head>
  <body>
    <ul>
      <?php foreach ($rows as $row): ?>
        <li><?= $row['content'] ?></li>
      <?php endforeach ?>
    </ul>
  </body>
</html>

最后 index.php 作为控制器,只需要把数据 tasks.php 和模板 tasks.html.php 『粘』起来:

<?php

$rows = require 'tasks.php';
// include 就是 require,唯一的区别是,如果 include 找不到包含的文件,只会抛出警告而不是严重错误
include 'tasks.html.php';

实际上,console/list.php 虽然在命令行下运行,依然可以算作一种『视图』,所以也可以套用我们的 MVC 模式,当然这里为了简单起见,就只修改获取数据部分代码,不再为其单独写视图文件了,这里也是想告诉大家,不需要拘泥于形式,如果你本身的视图就没有复杂到需要单独一个文件来维护,就没有必要硬添模板文件。

<?php

$rows = require __DIR__.'/../tasks.php';

foreach ($rows as $row) {
    echo $row['content'], ' @ ', $row['created_at'], PHP_EOL;
}

最后,如果对比了我 11 年写的文章,可能会发现我在获取数据的时候,并没有使用函数,而是直接 require 来的,其实这两种做法传递的想法都是一样,只要达到我们『分工』,『解耦』的目的,都是好方法。

本章完整代码看这里

人人都能看懂的全栈开发教程——MVC by Chris Yue is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

微信赞赏码

如果觉得文章还不错,就请扫码鼓励一下作者吧
天使打赏人

发表评论

6 + 1 =