构建自己的小型PHP框架(一)

前面框架已经可以通过路由访问了,我们总不可能把业务写在各个路由的回调里面吧,所以需要按一般框架实现MVC.
新增目录application,application目录下新建model,controller,view,开始我们的MVC
进入controller,新增类CommonController

<?php
  namespace Application\controller;

  class CommonController
  {
    public $params = [];
    public function __construct()
    {
      $this->params = $_POST;
    }
  }
?>

新增类IndexController继承CommmonController

<?php
  namespace Application\controller;
  
  class IndexController extends CommonController
  {
    public function Welcome()
    {
      echo "hello";
    }
  }
?>

打开config/routes.php,配置路由指向Controller
原来的路由

<?php

  use NoahBuscher\Macaw\Macaw;

  Macaw::get('/', function() {
    echo "success";
  });
  
  Macaw::get('(:all)', function($error) {
    echo 'routes fail'.$error;
  });
  
  Macaw::dispatch();
?>

配置后的路由

<?php
  
  use NoahBuscher\Macaw\Macaw;
  
  Macaw::get('index/welcome', 'Application\controller\IndexController@Index');
  
  Macaw::get('(:all)', function ($fu) {
    echo 'invalid routes' . $fu;
  });
  
  Macaw::dispatch();
?>

访问下http://127.0.0.14016/index/welcome,结果

Class 'Application\controller\IndexController' not found

为什么呢,原来我们框架还没配置PSR-4规范(也可以用PSR-0规范去处理,但是不推荐)
打开composer.json,配置命名空间指向目录
修改前

{
  "name": "root/sh_framework",
  "require": {
      "noahbuscher/macaw": "dev-master"
  }
}

修改后

{
  "name": "root/framework",
  "require": {
      "noahbuscher/macaw": "dev-master"
  },
  "autoload": {
      "psr-4": {
          "Application\\": "application/"
      }
  }
}

运行

/usr/local/bin/php composer.phar dump-autoload

这个时候,就把我们的命名空间指向到对应的目录里面了,继续访问上面的路由看看会不会输出:hello
我们的model也可以使用了,一个简单的api框架已完成。
我们的view可以直接PHP输出,如在view目录下新建welcome.php

<?php
  echo "这是一个view";
?>

修改下IndexController的welcome方法,require你的welcome.php

<?php
  namespace Application\controller;

  class IndexController extends CommonController
  {
    public function Welcome()
    {
      require dirname(__FILE__).'/../view/wecome.php';
    }
  }

?>

结果会输出:这是一个view。
利用composer引入各种你需要的类库
当我们需要操作mongodb扩展的时候

/usr/local/php/bin/php composer.phar require mongodb/mongodb

当我们需要http请求的时候

/usr/local/php/bin/php composer.phar require guzzlehttp/guzzle

当我们需要操作redis的时候

/usr/local/php/bin/php composer.phar require /usr/local/php/bin/php composer.phar require guzzlehttp/guzzle

至此,一个简单的PHP框架搭建完成。可以继续在这基础上完善自己额外需要的功能,比如加入中间件,加入验证等