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

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

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

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

  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 方法。

index
index

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

我是 Index 制器的 demo 方法

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,180评论 5 124
  • 1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式。 MVC...
    申城墨道阅读 2,015评论 0 10
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,370评论 25 707
  • 醋是一种发酵的酸味液态,作为中国各大菜系中传统的调味品,醋真的能抗癌吗?科学实验证明,以糙米为原料的陈醋的防癌效果...
    西魁阅读 706评论 0 0