美文网首页
laravel 5.3 5.4 5.5 中 route 路由源码

laravel 5.3 5.4 5.5 中 route 路由源码

作者: 精灵GG | 来源:发表于2018-01-18 17:30 被阅读0次

    Laravel版本:5.3以上

    源码路径:vendor/laravel/framework/src/Illuminate/Routing

    门面(别名):Illuminate\Support\Facades\Route

    服务提供者:

    map触发流程

    夫类:Illuminate\Foundation\Support\Providers\RouteServiceProvider

        子类向外服务触发 public function boot() --->

        内部调用 protected function loadRoutes()--->

         触发子类map方法 $this->app->call([$this, 'map'])

    向往提供子类:App\Providers\RouteServiceProvider

    map加载内容

    Api路由:

        $this->mapApiRoutes(); protected权限,不可以随意调用

        加载routes/api.php文件,并默认使用api中间件。可以通过控制api中间件来控制api的所有路由。

        Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php'));

    Web路由:

        $this->mapWebRoutes(); protected权限,不可以随意调用

        加载routes/web.php文件,并默认使用web中间件。可以通过控制web中间件来控制web的所有路由。

            Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php'));

    最容易疑惑的地方

     Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php'));

    这语句中的group,如果看成是

    vendor/laravel/framework/src/Illuminate/Routing/Router.php中的group方法,那就会更加迷惑了。

    可以尝试 Route::group(base_path('routes/web.php'));

    其实这里的group方法是调vendor/laravel/framework/src/Illuminate/Routing/RouteRegistrar.php 中的group方法。

    具体流程如下

    实例化Application

    vendor/laravel/framework/src/Illuminate/Foundation/Application.php

    protected function registerBaseServiceProviders()

    {

        $this->register(new EventServiceProvider($this));

        $this->register(new LogServiceProvider($this));

        $this->register(new RoutingServiceProvider($this)); //注册路由

    }

    实例化路由

    vendor/laravel/framework/src/Illuminate/Routing/RoutingServiceProvider.php

    注册路由:

    protected function registerRouter()

    {

        $this->app->singleton('router', function ($app) {

            return new Router($app['events'], $app);

    });

    }

    注册门面(别名)

    /Volumes/data/source/zhonghui/vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php

    protected static function getFacadeAccessor()

    {

        return 'router';

    }

    声明门面(别名)

    config/app.php中

    'Route' => Illuminate\Support\Facades\Route::class,

    调用ResourceRegistrar

    vendor/laravel/framework/src/Illuminate/Routing/Router.php

    public function __call($method, $parameters)

    {

        if (static::hasMacro($method)) {

            return $this->macroCall($method, $parameters);

    }

        return (new RouteRegistrar($this))->attribute($method, $parameters[0]);

    }

    看这里就能解析为什么Route::group(base_path('routes/web.php'))会报错。因为这样写会调用Router里面的group方法,但是Route先调用'as', 'domain', 'middleware', 'name', 'namespace', 'prefix'这几个方法,就不会调用Router里面的group。因为会触发__call方法进入ResourceRegistrar中。

    vendor/laravel/framework/src/Illuminate/Routing/ResourceRegistrar.php

    public function group($callback)

    {

        $this->router->group($this->attributes, $callback);

    }

    以上就是route部分简要解析,有空会把剩下的解析分享给大家。

    相关文章

      网友评论

          本文标题:laravel 5.3 5.4 5.5 中 route 路由源码

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