侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

用 Composer构建自己的 PHP 框架之设计 MVC

php  /  管理员 发布于 7年前   238

回顾

在上一篇教程中,我们使用 codingbean/macaw 这个 Composer 包构建了两条简单路由,第一条是响应 GET ‘/fuck' 的,另一条会 hold 住所有请求。其实对 PHP 框架来说,有了路由就有了一切。所以接下来我们要做的事情就是让 MFFC 框架更加规范,更加丰满。

这就牵扯到了 PHP 框架另外的价值:确立开发规范以便于`多人协作`,使用 ORM`、`模板引擎 等工具以`提高开发效率`。

正式开始规划文件夹

新建 MFFC/app 文件夹,在 app 中创建 controllers、models、views 三个文件夹,开始正式开始踏上 MVC 的征程。

(谁说我抄 Laravel 了,我抄的明明是 Rails :-D)

使用命名空间

新建 controllers/BaseController.php 文件:

/**
* BaseController
*/
class BaseController
{
 
  public function __construct()
  {
  }
}

新建 controllers/HomeController.php 文件:

/**
* \HomeController
*/
class HomeController extends BaseController
{
 
  public function home()
  {
    echo "

控制器成功!

";
  }
}

增加一条路由: 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`,稍等片刻,刷新,你将看到以下内容(别忘了调节编码哦~):


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

连接数据库

新建 models/Article.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 '

'.$row["title"].'

';
      echo '

'.$row["content"].'

';
    }
    mysql_close($connection);
  }
}

修改 controllers/HomeController.php 文件:

刷新,这时候会得到 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,'我是标题','

我是内容呀~~

我真的是内容,不信算了,哼~ O(∩_∩)O

'),
 (2,'我是标题','

我是内容呀~~

我真的是内容,不信算了,哼~ O(∩_∩)O

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

然后,刷新!你将看到以下页面:


恭喜你!MVC 中的 M 和 C 都已经实现!接下来我们开始调用 V (视图)。

调用视图

修改 models/Article.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:

/**
* \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 视图,把数据填充进视图,返回给访客,流程结束。

您可能感兴趣的文章:

  • PHP 开发者该知道的 5 个 Composer 小技巧
  • 用 Composer构建自己的 PHP 框架之使用 ORM
  • 用 Composer构建自己的 PHP 框架之构建路由
  • 用 Composer构建自己的 PHP 框架之基础准备
  • PHPer 需要了解的 5 个 Composer 小技巧
  • PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
  • PHP管理依赖(dependency)关系工具 Composer 安装与使用
  • PHP创建自己的Composer包方法


  • 上一条:
    用 Composer构建自己的 PHP 框架之使用 ORM
    下一条:
    用 Composer构建自己的 PHP 框架之构建路由
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客