使用macaw搭建MVC结构

Jackey PHP 4,702 次浏览 , , 没有评论

前言

在上一篇文章中,我们使用 codingbean/macaw 这个 Composer 包构建了两条简单路由,第一条是响应 GET ‘/fuck’ 的,另一条会 hold 住所有请求。其实对 PHP 框架来说,有了路由就有了一切。所以接下来我们要做的事情就是让 MFFC 框架更加规范,更加丰满。这就牵扯到了 PHP 框架另外的价值:确立开发规范以便于多人协作,使用 ORM、模板引擎 等工具以提高开发效率。

创建Controllers

规划文件夹

新建 app 文件夹,在 app 中创建 controllersmodelsviews 三个文件夹,开始正式开始踏上 MVC 的征程。

使用命名空间

新建 controllers/BaseController.php 文件:

  1. <?php
  2. /**
  3.  * BaseController
  4.  */
  5. class BaseController
  6. {
  7. public function __construct()
  8. { }
  9. }

 

新建 controllers/HomeController.php 文件:

  1. <?php
  2.  
  3. /**
  4.  * \HomeController
  5.  */
  6. class HomeController extends BaseController
  7. {
  8. public function home()
  9. {
  10. echo "<h1>控制器成功!</h1>";
  11. }
  12. }

 

此时,我们只需要增加一条路由即可:Macaw::get(”, ‘HomeController@home’);,打开浏览器直接访问 http://127.0.0.1:3000/,出现以下提示:

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

为什么没找到 HomeController 类?因为我们没有让他自动加载,修改 composer.json为:

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

运行 composer dump-autoload,稍等片刻,刷新,你将看到内容

创建Models

新建 models/Article.php 文件,内容为(数据库密码请自行更改):

  1. <?php
  2.  
  3. class Article
  4. {
  5. public static function first()
  6. {
  7. $connection = mysqli_connect("localhost", "root", "root", "test");
  8. if (!$connection) {
  9. die('Could not connect: ' . mysqli_error());
  10. }
  11. mysqli_set_charset($connection, "UTF8");
  12. $result = mysqli_query($connection, "SELECT * FROM articles limit 0,1");
  13. if ($row = mysqli_fetch_array($result)) {
  14. return $row;
  15. }
  16. mysqli_close($connection);
  17. }
  18. }

 

修改 controllers/HomeController.php 文件:

  1. <?php
  2. /**
  3.  * \HomeController
  4.  */
  5. class HomeController extends BaseController
  6. {
  7. public function home()
  8. {
  9. $res = Article::first();
  10. print_r($res);
  11. }
  12. }

 

刷新,这时候会得到 Article 类未找到的信息,因为我们没有更新自动加载配置:

composer dump-autoload

在等待的时间里,我们去建立数据库 test,在里面建立表 articles,设计两个字段 titlecontent 用于记录信息,并填充进至少一条数据。你也可以在建立完成 test 数据库以后运行以下 SQL 语句:

  1. DROP TABLE IF EXISTS `articles`;
  2. CREATE TABLE `articles` (
  3. `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  4. `title` varchar(255) DEFAULT NULL,
  5. `content` longtext,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  8. LOCK TABLES `articles` WRITE;
  9. /*!40000 ALTER TABLE `articles` DISABLE KEYS */;INSERT INTO `articles` (`id`, `title`, `content`)
  10. VALUES
  11. (1,'我是标题','我是内容1'),
  12. (2,'我是标题','我是内容2');
  13. /*!40000 ALTER TABLE `articles` ENABLE KEYS */;
  14. UNLOCK TABLES;

 

然后,刷新!你就会看到相关的内容

创建Views

首先先修改 controllers/HomeController.php 文件:

  1. <?php
  2.  
  3. class HomeController extends BaseController
  4. {
  5. public function home()
  6. {
  7. $res = Article::first();
  8. require dirname(__FILE__) . '/../views/Home.php';
  9. }
  10. }

 

创建Views/Home.php文件:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title><?php ?></title>
  6. </head>
  7. <body>
  8. <?php
  9. echo "<h1>" . $res['username'] . "</h1><br/>";
  10. ?>
  11. </body>
  12. </html>

 

保存,刷新,你将得到跟上面一模一样的页面,视图调用成功!

小结

至此,一个非常简单的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. 在 这个框架 里,一个 URL 驱动框架做的事情基本是这样的:入口文件 require 控制器,控制器 require 模型,模型和数据库交互得到数据返回给控制器,控制器再 require 视图,把数据填充进视图,返回给访客,流程结束。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Go