php framework程序员

如何写一个自己的渣渣PHP框架(3)

2017-03-28  本文已影响188人  郭贰小姐

我想写个高级框架,却写了个渣渣框架。渣渣框架还能不能称得上是框架?

看来只能听一首之前淘的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 呀。你看,这样配置不是也挺好的。

rewriterewrite

然后在 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 有很多关于路由的包,也有的有很详细的介绍说明。

  1. 比如 岁寒 用的 "noahbuscher/macaw" 这个路由包,他博客里做了详细介绍。
  2. 比如我 二狗子哥 用的 "nikic/fast-route" 这个路由包,我二狗子哥的博客写了两年了还没上线,:joy: 不然我狗子哥必定大显身手,介绍一番。
  3. 还有我原来看的一个开源框架,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 方法。

indexindex

访问 index.php?c=index&a=demo 这个地址,当然就会出现:

我是 Index 制器的 demo 方法

再来一首Glow Curve发光曲线的 小雷音之歌 表示本篇结束!

上一篇下一篇

猜你喜欢

热点阅读