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部分简要解析,有空会把剩下的解析分享给大家。