资讯专栏INFORMATION COLUMN

来!狂撸一款PHP现代化框架 (路由的设计)

trilever / 3120人阅读

摘要:先从开始参照规定设定接口方法分别为,当然也是规范了以上标准请求。查看存储是否符合预期。包括测试对路由创建后是否为的实现。具体可查看致谢上述已完成了路由的基本设计,下一章将讲解从启动到请求路由映射到服务脚本的过程。

前言

上一篇的标题改了一下,以一、二、三为章节对读者来说是种困扰,现在的标题是依照项目进度来编写的。上篇文章地址为 https://segmentfault.com/a/11...

这一系列文章并不准备写太多章节,大概规划的只有4~5章左右,具体实现代码还请移步Github
https://github.com/CrazyCodes...

本章详细讲解一下Route(路由的实现),Come on Up Image

上图大概说明了实现路由要经过两个步骤

将所有路由信息存储到超全局变量中

用户请求时从全局变量中查找路由映射的服务脚本并实例化

OK,大概流程就是酱紫,下面开始“撸”

目录

路由的代码暂分为以下几个文件(这并不是确定的,详细可查看Github)

文件名 注释
Route 转发文件:为实现 Route::get 效果
RouteCollection 路由信息处理存储
RouteInterface 无需解释
RouteModel 路由模型,将每个路由信息以结构体方式存储到$_SERVER
Router 路由的核心类

莫急,我们一个一个文件来看。先从RouteInterface开始

RouteInterface

参照RESTful规定设定接口方法分别为 GET、POST、PATCH、PUT、DELETE、OPTIONS,当然Laravel也是规范了以上标准请求。

GitHub : https://github.com/CrazyCodes...

interface RouteInterface
{
    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function get($uri, $action = null);

    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function post($uri, $action = null);

    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function patch($uri, $action = null);

    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function put($uri, $action = null);

    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function delete($uri, $action = null);

    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function options($uri, $action = null);
}
Router

先写一个栗子

public function get($uri, $action = null)
{
    return $this->addRoute("GET", $uri, $action);
}

用户调用下方代码会指向上述方法,方法既调用addRoute方法将路由信息存储到$_SERVER中

Route::get("/","Controller")

以下为addRoute部分的代码

public function addRoute($methods, $uri, $action)
{
    // 这里判断请求方式是否合规,既是否存在  GET、POST、PATCH、PUT、DELETE、OPTIONS其中之一
    if ($this->verify($methods) == false) {
        return false;
    }
    
    // 之后我们去往RouteCollection路由信息的处理类中
    return $this->routes->add($uri, $this->createRoute($methods, $action));
}
RouteCollection

最终达到 add 方法,将路由信息存储到$_SERVER中

public function add($uri, RouteModel $model)
{
    if (empty($_SERVER["routes"][$uri])) {
        $_SERVER["routes"][$uri] = $model;
    }
}

第二个参数RouteModel开始我们说过这是路由模型,将每个路由以结构体的方式存储到变量中,存储后的结果

"routes" =>
  array(6) {
    "test/get" =>
    class ZeroRoutingRouteModel#13 (2) {
      public $method =>
      string(3) "GET"
      public $action =>
      string(19) "testController@test"
    }
    "test/post" =>
    class ZeroRoutingRouteModel#14 (2) {
      public $method =>
      string(4) "POST"
      public $action =>
      string(19) "testController@test"
    }
    "test/put" =>
    class ZeroRoutingRouteModel#15 (2) {
      public $method =>
      string(3) "PUT"
      public $action =>
      string(18) "testController@put"
    }
    "test/del" =>
    class ZeroRoutingRouteModel#16 (2) {
      public $method =>
      string(6) "DELETE"
      public $action =>
      string(18) "testController@del"
    }
    "test/patch" =>
    class ZeroRoutingRouteModel#17 (2) {
      public $method =>
      string(5) "PATCH"
      public $action =>
      string(20) "testController@patch"
    }
    "test/opt" =>
    class ZeroRoutingRouteModel#18 (2) {
      public $method =>
      string(7) "OPTIONS"
      public $action =>
      string(18) "testController@opt"
    }
  }
Route

最后通过__callStatic将代码重定向到核心类中

public static function __callStatic($name, $arguments)
{
    $router = new Router;
    
    return $router->{$name}($arguments[0], $arguments[1]);
}

上述套路部分是Laravel的设计思想,通过这款简单的框架可对Laravel核心设计有丁点的理解。

测试

测试上次做的有点糙,从本章到系列结束,我们都以PHPunit来测试。

/**
 * @content tests all methods storage -> $_SERVER["routes"]
 */
public function testAllMethodsStorage()
{
    $this->routes->get($methodGet = "test/get", "testController@test");
    $this->assertArrayHasKey($methodGet, $_SERVER[$this->methodsDataKey]);
    
    $this->routes->post($methodPost = "test/post", "testController@test");
    $this->assertArrayHasKey($methodPost, $_SERVER[$this->methodsDataKey]);
    
    $this->routes->put($methodPut = "test/put", "testController@put");
    $this->assertArrayHasKey($methodPut, $_SERVER[$this->methodsDataKey]);
    
    $this->routes->delete($methodDel = "test/del", "testController@del");
    $this->assertArrayHasKey($methodDel, $_SERVER[$this->methodsDataKey]);
    
    $this->routes->patch($methodPatch = "test/patch", "testController@patch");
    $this->assertArrayHasKey($methodPatch, $_SERVER[$this->methodsDataKey]);
    
    $this->routes->options($methodOpt = "test/opt", "testController@opt");
    $this->assertArrayHasKey($methodOpt, $_SERVER[$this->methodsDataKey]);
}

上述贴出部分代码,以过程化的方法去测试。查看存储是否符合预期。

/**
 * @content RouteModel Success
 */
public function testCreateRoute()
{
    $response = $this->routes->createRoute("GET", "TestController@Get");
    
    $this->assertInstanceOf(RouteModel::class, $response);
}

包括测试对路由创建后是否为RouteModel的实现。具体可查看Github
https://github.com/CrazyCodes...

致谢

上述已完成了路由的基本设计,下一章将讲解从启动到请求路由映射到服务脚本的过程。

希望本章可以帮到你,谢谢。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29805.html

相关文章

  • !狂撸一款PHP代化框架 (准备工作)

    摘要:前期做任何一件事情都要有个前期准备工作。作为的规定,我们命名空间得有一个祖宗名字,这里我叫他神圣的至少需要一个库来存储这个项目创建一个文件用于进行包管理灰常简单,搞进来。 showImg(https://segmentfault.com/img/bVbkFcs?w=800&h=450); 前言 从本章开始,我们继续造轮子,去完成一款类似于Laravel的现代化PHP框架,为什么说是现代...

    JellyBool 评论0 收藏0
  • 通过实现依赖注入和路由,构建一个自己代化PHP框架

    摘要:依赖注入通过构造注入,函数调用或者属性的设置来提供组件的依赖关系。这段代码可以用依赖注入重构,从而解耦现在我们通过外界给予类的依赖,而不是让它自己产生依赖的对象。根据依赖注入的概念,我们的框架实现了这些特性。 如何提高自己编写代码的能力呢?我们首先想到的是阅读学习优秀的开源项目,然后写一个自己的web框架或类库组件。作为web开发者,我们通常都是基于面向对象OOP来开发的,所以面向对象...

    waltr 评论0 收藏0
  • 你不可不知道20个优秀PHP框架

    摘要:每一个开发者都知道,拥有一个强大的框架可以让开发工作变得更加快捷安全和有效。官方网站是一款老牌的框架,现在稳定版本已经是了。官方网站是由最大的社区之一的管理开发的,也是一个开源的框架。 对于Web开发者来说,PHP是一款非常强大而又受欢迎的编程语言。世界上很多顶级的网站都是基于PHP开发的。 每一个开发者都知道,拥有一个强大的框架可以让开发工作变得更加快捷、安全和有效。在开发项目之前选...

    zombieda 评论0 收藏0
  • 看吧,这就是代化 PHP 该有样子

    摘要:这大概是我没有及早使用,或多数开发者流连现状造成的。它就是,一个的框架。行为驱动开发是来自测试驱动开发的开发过程。简单的说,它就是经常可能一天几次将小块代码整合进基础代码当中的行为。 showImg(https://segmentfault.com/img/remote/1460000013769815); 这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍 。 文章...

    Tangpj 评论0 收藏0
  • QueryPHP V1-beta.1 部分文档代码解耦,版本PHP 7.3.2

    摘要:百分之百单元测试覆盖直面一剑封喉,基于实现框架常驻,依托生态实现业务常驻,此刻未来逐步渐进。国际化例子函数随机数字优化最开始采用的的继承一个基础的,方便单元测试有一定性能损失。 经过 1 个月的开发,QueryPHP v1.0.0-beta.1 版本可以发布了,这也是 beta 3 个版本的开始部分。这个版本的主要是代码解耦和性能提升,文档开发。 关于 QueryPHP QueryPH...

    lentrue 评论0 收藏0

发表评论

0条评论

trilever

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<