利用 Composer 一步一步構建本身的 PHP 框架(三)——設計 MVC

本教程示例代碼見 https://github.com/johnlui/My-First-Framework-based-on-Composerphp


回顧

在上一篇教程中,咱們使用 codingbean/macaw 這個 Composer 包構建了兩條簡單路由,第一條是響應 GET ‘/fuck’ 的,另外一條會 hold 住全部請求。其實對 PHP 框架來講,有了路由就有了一切。因此接下來咱們要作的事情就是讓 MFFC 框架更加規範,更加豐滿。mysql

這就牽扯到了 PHP 框架另外的價值:確立開發規範以便於多人協做,使用 ORM、模板引擎 等工具以提升開發效率。git


正式開始

規劃文件夾

新建 MFFC/app 文件夾,在 app 中建立 controllers、models、views 三個文件夾,開始正式開始踏上 MVC 的征程。github

(誰說我抄 Laravel 了,我抄的明明是 Rails :-D)sql

使用命名空間

新建 controllers/BaseController.php 文件:數據庫

<?php
/**
* BaseController
*/
class BaseController
{
  
  public function __construct()
  {
  }
}

新建 controllers/HomeController.php 文件:json

<?php

/**
* \HomeController
*/
class HomeController extends BaseController
{
  
  public function home()
  {
    echo "<h1>控制器成功!</h1>";
  }
}

增長一條路由: Macaw::get('', 'HomeController@home ');,打開瀏覽器直接訪問 http://127.0.0.1:81/,出現如下提示:數組

Fatal error: Class 'HomeController' not found in /Library/WebServer/Documents/wwwroot/MFFC/vendor/codingbean/macaw/Macaw.php on line 93

爲何沒找到 HomeController 類?由於咱們沒有讓他自動加載,修改 composer.json 爲:瀏覽器

{
  "require": {
    "codingbean/macaw": "dev-master"
  },
  "autoload": {
    "classmap": [
      "app/controllers",
      "app/models"
    ]
  }
}

運行 composer dump-autoload,稍等片刻,刷新,你將看到如下內容(別忘了調節編碼哦~):架構

Image

恭喜你,命名空間使用成功!

鏈接數據庫

新建 models/Article.php 文件,內容爲(數據庫密碼請自行更改):

<?php
/**
* Article Model
*/
class Article
{
  public static function first()
  {
    $connection = mysql_connect("localhost","root","password");
    if (!$connection) {
      die('Could not connect: ' . mysql_error());
    }

    mysql_set_charset("UTF8", $connection);

    mysql_select_db("mffc", $connection);

    $result = mysql_query("SELECT * FROM articles limit 0,1");

    if ($row = mysql_fetch_array($result)) {
      echo '<h1>'.$row["title"].'</h1>';
      echo '<p>'.$row["content"].'</p>';
    }

    mysql_close($connection);
  }
}

修改 controllers/HomeController.php 文件:

<?php

/**
* \HomeController
*/
class HomeController extends BaseController
{
  
  public function home()
  {
    Article::first();
  }
}

刷新,這時候會獲得 Article 類未找到的信息,由於咱們沒有更新自動加載配置:

composer dump-autoload

在等待的時間裏,咱們去創建數據庫 mffc,在裏面創建表 articles,設計兩個字段 title、content 用於記錄信息,並填充進至少一條數據。你也能夠在創建完成 mffc 數據庫之後運行如下 SQL 語句:

DROP TABLE IF EXISTS `articles`;

CREATE TABLE `articles` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `content` longtext,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

LOCK TABLES `articles` WRITE;
/*!40000 ALTER TABLE `articles` DISABLE KEYS */;

INSERT INTO `articles` (`id`, `title`, `content`)
VALUES
	(1,'我是標題','<h3>我是內容呀~~</h3><p>我真的是內容,不信算了,哼~ O(∩_∩)O</p>'),
	(2,'我是標題','<h3>我是內容呀~~</h3><p>我真的是內容,不信算了,哼~ O(∩_∩)O</p>');

/*!40000 ALTER TABLE `articles` ENABLE KEYS */;
UNLOCK TABLES;

而後,刷新!你將看到如下頁面:

Image

恭喜你!MVC 中的 M 和 C 都已經實現!接下來咱們開始調用 V (視圖)。


調用視圖

修改 models/Article.php 爲:

<?php
/**
* Article Model
*/
class Article
{
  public static function first()
  {
    $connection = mysql_connect("localhost","root","C4F075C4");
    if (!$connection) {
      die('Could not connect: ' . mysql_error());
    }

    mysql_set_charset("UTF8", $connection);

    mysql_select_db("mffc", $connection);

    $result = mysql_query("SELECT * FROM articles limit 0,1");

    if ($row = mysql_fetch_array($result)) {
      return $row;
    }

    mysql_close($connection);
  }
}

將包含查詢結果的數組返回。修改 HomeController:

<?php
/**
* \HomeController
*/
class HomeController extends BaseController
{
  
  public function home()
  {
    $article = Article::first();
    require dirname(__FILE__).'/../views/home.php';
  }
}

保存,刷新,你將獲得跟上面如出一轍的頁面,視圖調用成功!


幾乎全部人都是經過學習某個框架來了解 MVC 的,這樣可能框架用的很熟,一旦離了框架一個簡單的頁面都寫不了,更不要說本身設計 MVC 架構了,其實這裏面也沒有那麼多門道,原理很是清晰,我說說個人感悟:

1. PHP 框架再牛逼,他也是 PHP,也要遵循 PHP 的運行原理和基本哲學。抓住這一點咱們就能很容易地理解不少事情。

2. PHP 作的網站從邏輯上說,跟 php test.php 沒有任何區別,都只是一段字符串做爲參數傳遞給 PHP 解釋器而已。無非就是複雜的網站會根據 URL 來調用須要運行的文件和代碼,而後返回相應的結果。

3. 不管咱們看到的是 CodeIgniter 這樣 180 個文件組成的「小框架」,仍是 Laravel 這樣加上 vendor 一共 3700 多個文件的 「大框架」,他們都會在每個 URL 的驅動下,組裝一段能夠運行的字符串,傳給 PHP 解釋器,再把從 PHP 解釋器返回的字符串傳給訪客的瀏覽器。

4. MVC 是一種邏輯架構,本質上是爲了讓人腦這樣的超低 RAM 的計算機可以製造出遠超人腦 RAM 的大型軟件,其實 MVC 架構在 GUI 軟件出現之前就已經成形,命令行輸出也是視圖嘛。

5. 在 MFFC 裏,一個 URL 驅動框架作的事情基本是這樣的:入口文件 require 控制器,控制器 require 模型,模型和數據庫交互獲得數據返回給控制器,控制器再 require 視圖,把數據填充進視圖,返回給訪客,流程結束。

相關文章
相關標籤/搜索