3.3 - Laravel - 5.6 - Route - 加载单个Route实例的主要流程

前面涉及了laravel如何对路由配置文件的加载过程的细节,这章节来看下单个路由实例的加载流程。也就是路由配置文件中 get post 这些常用方法的源码逻辑。

1.我们从一个例子入手:

Route::get('connect', 'AccountController@connect')->name('connect');

首先这里的Route是一个facade,对应的类是Illuminate\Routing 下的
Router类。

注意是Router类 不是Route类。注意区分。
这个地方非常不好的是 声明了一个Router的Facade,返回的却是Route。容易混淆。不知道有什么特殊的目的。

这个Router类会实现接口,BindingRegistrar 和 RegistrarContract

class Router implements BindingRegistrar, RegistrarContract{...}

2.然后我们可以找到Router类下的get方法源码

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

2.1 可以看到get方法就是调用了addRoute方法。post put 等方法也雷同,最后都是调用的addRote方法,只是相应传入不一样的参数而已。

这里注意get方法传入的第一个参数是一个数组[‘GET’, ‘HEAD’],可以看到当你调用get方法时 laravel 在这里是集中处理http的head和get方法的。

2.2 接着看下addRoute方法的源码:也是主要的逻辑代码
分为两步

  1. createRoute 创建路由
  2. routes->add 保存路由
    public function addRoute($methods, $uri, $action)
     {
         return $this->routes->add($this->createRoute($methods, $uri, $action));
     }
    

a.首先这里的变量`$routes` 是一个RouteCollection实例,在当前这个类`Router`实例化的时候(也就是laravel初始化的时候) 会在构造函数中进行初始化。参看下面构造函数代码:
>从这个`RouteCollection`名字看,应该是存储所有Route对象的一个集合类。先不去管它。

public function __construct(Dispatcher $events, Container $container = null)
{
$this->events = $events;
$this->routes = new RouteCollection;
$this->container = $container ?: new Container;
}


b.然后变量`$routes`调用的`add()`方法就是RouteCollection提供的add方法,
此 add 方法代码如下:

public function add(Route $route)
{
$this->addToCollections($route);

    $this->addLookups($route);

    return $route;
}
add方法的分析放在了其他小节,这个方法的作用就是:把传入的`$route`对象进行保存。同时会返回这个`$route`对象。而这个`route`对象就是我们根据上面的给的例子 `get方法`创建出来的route对象。

>**add的逻辑具体的分析看章节 RouteCollection的add方法源码。**


c.上面的路由route对象是由调用createRoute方法创建的。
具体创建路由的过程放在了下一节。

$this->createRoute($methods, $uri, $action)


----
总结:
路由配置文件对单个路由的加载流程基本上就是:
1.统一调用addRoute方法。
2.通过Router类的createRoute方法创建路由。
3.把创建的路由对象存入RouteCollection对象中。
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!