我想写个高级框架,却写了个渣渣框架。渣渣框架还能不能称得上是框架?
看来只能听一首之前淘的Tom Day的 Flemington 压压惊了Q!
上一篇的时候大概说了自动加载,然后我这几天就想啊想啊,想配置文件和路由。想了很多种方式,还是没有想好,没事。然而值得开心的是我终于写了我的二狗子say: “hello world” PHP扩展,并且成功编译安装!
- 配置文件
就说想了很久还是没想好嘛,所以我就在每一个类里建立一个成员变量,在构造函数里初始化他,先这样,我感觉好像是不好,这样的话相当于每个类里面都要实例化这个配置类了,搞一个单例模式,但是我还没想好。
就像这样:
<?php
/**
* 框架核心类
* User: momoma
* Date: 2017/1/19
* Time: 上午10:52
*/
namespace core\momoma;
use core\lib\Route;
use Noodlehaus\Config;
class Momoma {
private $controller; //默认控制器
private $action; //默认方法
private $conf; //配置文件
public function __construct() {
$this->conf = new Config(MOMOMA_PATH. '/config/conf.php');
}
}
你再想一个好办法。
- 路由
看了很多关于路由的内容,我们可以在框架里写自己的路由类,也可以直接去 nginx 里配置 rewrite 呀。你看,这样配置不是也挺好的。
然后在 nginx 里配置:
rewrite ^/index.html$ /index.php last;
rewrite ^/index.html$ /index.php?c=index&a=index last;
rewrite ^/product/([0-9]+).html$ /index.php?c=goods&a=detail&id=$1 last;
rewrite ^/article/([0-9]+).html$ /index.php?c=special&a=detail&id=$1 last;
rewrite ^/info/([0-9]+).html$ /index.php?c=article&a=detail&id=$1 last;
无论如何,路由就是如何根据 url 找到你所要访问的类和方法。
框架里的路由,首先 packagist 有很多关于路由的包,也有的有很详细的介绍说明。
- 比如 岁寒 用的 "noahbuscher/macaw" 这个路由包,他博客里做了详细介绍。
- 比如我 二狗子哥 用的 "nikic/fast-route" 这个路由包,我二狗子哥的博客写了两年了还没上线,:joy: 不然我狗子哥必定大显身手,介绍一番。
- 还有我原来看的一个开源框架,initPHP框架的 路由说明 和 源码。
其实我还是喜欢去 nginx 里做 rewrite 配置,喜欢我的原始状态 “index.php?c=index&a=run&id=1” 多好看呐。(主要简单(=@__@=)呀!)
也倒是哦,不然就先不说那么多的路由方式了,继续往下走。
首先建立目录 /data/momoma/core/lib 在 lib 目录里建立 Route.php 类:(其实这个路由类在这里并没有什么卵用,因为我继续往下走了,下面我获取控制器和方法的时候已经跳过他了,你也可以暂时先跳过,或者不)
<?php
/**
* 路由类
* User: momoma
* Date: 2017/1/23
* Time: 上午11:03
*/
namespace core\lib;
use Noodlehaus\Config;
class Route {
private $conf; //配置文件
public function __construct() {
$this->conf = new Config(MOMOMA_PATH. '/config/conf.php');
}
/**
* 路由的分发
*/
public function dispatcher() {
switch ($this->conf->get('route')) {
case 'path' :
$request = $this->getRequest();
$this->parsePathUri($request);
break;
default :
return false;
break;
}
return true;
}
/**
* @return mixed
*/
public function getRequest() {
return true;
}
/**
* @param $request
*/
public function parsePathUri($request){
}
}
这个路由类就是参考 initPHP框架的 路由类 - github.com 你可以看一下,也不用看懂,理解他大概是在干什么,他在框架是什么作用。大概这样?
马上就要用到控制器了,有了路由(其实本篇完全没具体说路由)根据 url 就能找到控制器了,我们先建立一个控制器,然后再接着说如何找到他。
建立目录 /data/momoma/controller 然后在 controller 里建立 IndexController.php 类:
<?php
/**
* Index控制器
* User: momoma
* Date: 2017/1/23
* Time: 下午3:44
*/
namespace controller;
class IndexController {
public function run(){
echo "我是 Index 制器的 run 方法";
}
public function demo(){
echo "我是 Index 制器的 demo 方法";
}
}
并且在 /data/config/conf.php 里加上默认控制器和方法配置:
return [
"debug"=> true,
'controller' => 'Index', // 默认控制器
'action' => 'run', // 默认方法
];
在类 Momoma 里,我们原来建立了核心入口 run 方法:
/**
* 框架核心入口
*/
public function run(){
// 路由分发功能
$route = new Route();
// 根据一些列的路由方法目的也是找到$_GET['c']和$_GET['a']
// 只不过方法更严谨,从 $_SERVER 里获取相应的内容
$route->dispatcher();
// 这里我们直接获取
$this->getRequest();
$class = "\\controller\\".ucfirst($this->controller)."Controller";
$obj = new $class();
$action = $this->action;
$obj->$action();
}
/**
* 获取controller和action
*/
public function getRequest(){
$this->controller = isset($_GET['c']) ? $_GET['c'] : $this->conf->get('controller');
$this->action = isset($_GET['a']) ? $_GET['a'] : $this->conf->get('action');
}
就像 :point_up: 注释里我说的其实我用了最直接的方法获取了$_GET['c']和$_GET['a'],(貌似跳过了路由类的具体实现方式,没事,主要表达中心思想。)然后根据路径拼接出 IndexController ,建立控制器的时候,就约定了使用驼峰式命名规则。你不用 include IndexController 因为他会自动加载的。
这时候你访问 index.php 屏幕上就会出现:(如果你的自动加载打印路径还没注释的话),因为配置文件里写了,默认访问 Index 控制器 里的 run 方法。
访问 index.php?c=index&a=demo 这个地址,当然就会出现:
我是 Index 制器的 demo 方法
再来一首Glow Curve发光曲线的 小雷音之歌 表示本篇结束!