DIY 實現 ThinkPHP 核心框架 (一)MVC

cn-five發表於2020-08-23

ThinkPHP 框架目前已經到了 6 ,與 5 相比,目錄結構有所改變, 5 的核心框架在根目錄 thinkphp 下,而 6 放在了 vendortopthink6 改進了中介軟體, ORM 元件獨立等等。但是他們的基本框架原理是一致的,比如支援 MVC 開發模式,都採用了路由、容器、控制反轉、依賴注入功能,使用 composer 實現類的自動載入等等。熟悉 ThinkPHP 框架原理對使用 5 或者 6 乃至以後的 7 都會更得心應手。

什麼是 MVC ?

MVC 是一種使用 MVCModel View Controller 模型-檢視-控制器)設計建立 Web 應用程式的模式。
Model(模型)是應用程式中用於處理應用程式資料邏輯的部分。通常模型物件負責在資料庫中存取資料。
View(檢視)是應用程式中處理資料顯示的部分。通常檢視是依據模型資料建立的。
Controller(控制器)是應用程式中處理使用者互動的部分。通常控制器負責從檢視讀取資料,控制使用者輸入,並向模型傳送資料。

搭建 LNMP

具體如何搭建 LNMP 平臺可以參考 Linux 開發環境 。本實驗環境引數為

CentOS Linux release 7.8
PHP 7.4.0
Nginx/1.18.0
Mysql  Ver 14.14 Distrib 5.7.31
Xhell 5
Navicat premium 15
VS code 1.48.1
Phpstorm 2020.1

建立虛擬主機

server {
        listen       80;
        server_name  diy.tp;

        access_log  logs/diy.tp..access.log  main;
        error_log logs/diy.tp..error.log;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location \ {
            try_files $uri $uri/  /index.html index.php;
        }

        location ~ ^(.+\.php)(.*)$ {
            # 實驗根目錄所在路徑,起始測試檔案放於此
            root           /home/web/mytp/public;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            # 設定 PATH_INFO 獲取 url 中的模組、控制器和方法
            fastcgi_split_path_info ^(.+\.php)(.*)$;     
            fastcgi_param PATH_INFO $fastcgi_path_info;    
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

    }

建立測試資料

// 建立資料庫
CREATE DATABASE tp;

// 建立資料表
CREATE TABLE `employees` (
  `empNum` int(10) unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '員工 id',
  `name` varchar(10) NOT NULL DEFAULT ' ' COMMENT '姓名',
  `gender` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '性別',
  `mobile` varchar(20) NOT NULL DEFAULT ' ' COMMENT '手機號',
  `email` varchar(40) NOT NULL DEFAULT ' ' COMMENT '郵箱',
) ENGINE=InnoDB DEFAULT CHARSET=utf8

// 插入測試資料
INSERT INTO `employees` VALUES (5000, 'Bob', 1, '12345678900', 'bob@thinkphp.demo');
INSERT INTO `employees` VALUES (5001, 'David', 1, '12345678901', 'david@thinkphp.demo');
INSERT INTO `employees` VALUES (5002, 'Michael', 1, '12345678902', 'michael@thinkphp.demo');
INSERT INTO `employees` VALUES (5003, 'Lily', 0, '12345678903', 'lily@thinkphp.demo');
INSERT INTO `employees` VALUES (5004, 'Lucy', 0, '12345678904', 'lucy@thinkphp.demo');
INSERT INTO `employees` VALUES (5005, 'Rose', 0, '12345678905', 'rose@thinkphp.demo');
INSERT INTO `employees` VALUES (5006, 'Merry', 0, '12345678906', 'merry@thinkphp.demo');

建立檢視 employee.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <table border="2" cellpadding="1" cellspacing="9">
        <tr><th>員工編號</th><th>姓名</th><th>性別</th><th>手機號</th><th>郵箱</th></tr>
        // 可以直接使用控制器中的變數 $data
        <?php foreach ($data as $row): ?>
        <tr>
            <td><?=$row['empNum'] ?></td>
            <td><?=$row['name'] ?></td>
            <td><?=['女', '男'][$row['gender']] ?></td>
            <td><?=$row['mobile'] ?></td>
            <td><?=$row['email'] ?></td>
        </tr>
        <?php endforeach; ?>
    </table>
</body>
</html>

建立模型 EmployeeModel.php

class EmployeeModel
{
    protected $link;

    // 連線資料庫
    public function __construct()
    {
        $this->link = new mysqli('127.0.0.1', 'root', '123456', 'tp');
        $this->link->set_charset('utf8');
    }

    // 獲取資料
    public function getAll()
    {
        $sql = "SELECT * FROM employees";
        $res = $this->link->query($sql);
        return $res->fetch_all(MYSQLI_ASSOC);
    }
}

建立控制器 EmployeeController.php

class EmployeeController
{
    public function index()
    {
        require 'EmployeeModel.php';
        $model = new EmployeeModel();
        // 此資料將被用於檢視 <table> 表格中
</table>
        $data = $model->getAll();
        require 'employee.html';
    }
}

建立 index.php

require 'EmployeeController.php';
$employee = new EmployeeController();
$employee->index();

此時目錄結構

/home/web/mytp/public/
EmployeeController.php
employee.html
EmployeeModel.php
index.php

訪問 http://diy.tp/index.php ,執行結果為

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章