美文网首页php framework程序员
如何写一个自己的渣渣PHP框架(3)

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

作者: 郭贰小姐 | 来源:发表于2017-03-28 19:09 被阅读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发光曲线的 小雷音之歌 表示本篇结束!

    相关文章

      网友评论

        本文标题:如何写一个自己的渣渣PHP框架(3)

        本文链接:https://www.haomeiwen.com/subject/lncsottx.html