Laravel 路由:prefix() 方法在哪里定义?
Laravel Routing: Where is the prefix() Method Defined?
在我的示例中,我定义了一条路线:
Route::prefix('home')->group(function(){
Route::get('/test',....);
});
当我访问 mydomain/home/test,
时,它起作用了。但是,我不知道 prefix
方法在哪里。我认为它可能在 Illuminate\Routing\Route.php.
但是当我删除 prefix
方法时,它仍然有效吗?
prefix
方法可用于为组中的每个路由添加给定 URI 前缀。
您可以使用此代码:
Route::group(['prefix' => 'home'], function () {
Route::get('test', 'yourController@yourFunctions');
}
或这个
Route::prefix('home')->group(function () {
Route::get('test', 'yourController@yourFunctions');
});
没关系,因为它给出了相同的结果。
更多信息:https://laravel.com/docs/5.4/routing#route-group-prefixes
prefix
方法位于Illuminate\Routing\Router
class.
典型 Laravel 5 应用程序中的绝对路径为:
vendor/laravel/framework/src/Illuminate/Routing/Router.php
如何找到?
您可能知道,当您编写 Route::
时,您实际上是在使用名为 Route
的 Laravel 门面。从那里你可以在 Laravel 5.4 的官方文档 https://laravel.com/docs/5.4/facades#facade-class-reference 中找到 facade class 参考。这是您要查找的行:
---------------------------------------------------------------
|Facade |Class |Service Container Binding |
---------------------------------------------------------------
|Route |Illuminate\Routing\Router |router |
---------------------------------------------------------------
流量
- (受保护的)
prefix
方法由 __call@Router
处理。 return (new RouteRegistrar($this))->attribute($method, $parameters[0]);
被执行
- 调用
attribute@RouteRegistrar
方法并将元素'prefix' => 'home'
添加到$this->attributes
数组
- 由于
attribute@RouteRegistrar
方法returns$this
,调用了group@RouteRegistrar
方法
group@RouteRegistrar
方法调用group@Router
方法
- 调用了
loadRoutes@Router
方法。它将解析闭包中存在的所有路由,即 Route::get('/test', ...)
;
- 这次
get
方法在 Route
门面下的 class 上调用,即 Router
class。 get@Router
方法执行
addRoute@Router
被调用,后者又调用 createRoute@Router
方法
createRoute@Router
使用带前缀的 URI 作为第二个参数调用 newRoute@Router
你会注意到 prefix@Router
方法调用 getLastGroupPrefix@Router
显然检索了最后一组的前缀。
@louisfischer 回答不正确。 Router::prefix
根本没有被调用。
从RouteRegistrar
调用prefix
方法,最终转发给RouteRegistrar::attribute
方法。
您可以通过查看 Illuminate\Support\Facades\Route
文档块来验证这一点。
* @method static \Illuminate\Routing\RouteRegistrar prefix(string $prefix)
完整流程如下:
- Route facade首先通过
Facade::__callStatic
. 将调用转发给Illuminate\Routing\Router
- 因为
Router::prefix
不是public
方法而是protected
方法,所以这个调用通过Router::__call
方法转发给RouteRegistrar::attribute
。
- 最后
prefix($url)
方法转换为RouteRegistrar::attribute('prefix', $url)
在我的示例中,我定义了一条路线:
Route::prefix('home')->group(function(){
Route::get('/test',....);
});
当我访问 mydomain/home/test,
时,它起作用了。但是,我不知道 prefix
方法在哪里。我认为它可能在 Illuminate\Routing\Route.php.
但是当我删除 prefix
方法时,它仍然有效吗?
prefix
方法可用于为组中的每个路由添加给定 URI 前缀。
您可以使用此代码:
Route::group(['prefix' => 'home'], function () {
Route::get('test', 'yourController@yourFunctions');
}
或这个
Route::prefix('home')->group(function () {
Route::get('test', 'yourController@yourFunctions');
});
没关系,因为它给出了相同的结果。
更多信息:https://laravel.com/docs/5.4/routing#route-group-prefixes
prefix
方法位于Illuminate\Routing\Router
class.
典型 Laravel 5 应用程序中的绝对路径为:
vendor/laravel/framework/src/Illuminate/Routing/Router.php
如何找到?
您可能知道,当您编写 Route::
时,您实际上是在使用名为 Route
的 Laravel 门面。从那里你可以在 Laravel 5.4 的官方文档 https://laravel.com/docs/5.4/facades#facade-class-reference 中找到 facade class 参考。这是您要查找的行:
---------------------------------------------------------------
|Facade |Class |Service Container Binding |
---------------------------------------------------------------
|Route |Illuminate\Routing\Router |router |
---------------------------------------------------------------
流量
- (受保护的)
prefix
方法由__call@Router
处理。return (new RouteRegistrar($this))->attribute($method, $parameters[0]);
被执行 - 调用
attribute@RouteRegistrar
方法并将元素'prefix' => 'home'
添加到$this->attributes
数组 - 由于
attribute@RouteRegistrar
方法returns$this
,调用了group@RouteRegistrar
方法 group@RouteRegistrar
方法调用group@Router
方法- 调用了
loadRoutes@Router
方法。它将解析闭包中存在的所有路由,即Route::get('/test', ...)
; - 这次
get
方法在Route
门面下的 class 上调用,即Router
class。get@Router
方法执行 addRoute@Router
被调用,后者又调用createRoute@Router
方法createRoute@Router
使用带前缀的 URI 作为第二个参数调用newRoute@Router
你会注意到 prefix@Router
方法调用 getLastGroupPrefix@Router
显然检索了最后一组的前缀。
@louisfischer 回答不正确。 Router::prefix
根本没有被调用。
从RouteRegistrar
调用prefix
方法,最终转发给RouteRegistrar::attribute
方法。
您可以通过查看 Illuminate\Support\Facades\Route
文档块来验证这一点。
* @method static \Illuminate\Routing\RouteRegistrar prefix(string $prefix)
完整流程如下:
- Route facade首先通过
Facade::__callStatic
. 将调用转发给 - 因为
Router::prefix
不是public
方法而是protected
方法,所以这个调用通过Router::__call
方法转发给RouteRegistrar::attribute
。 - 最后
prefix($url)
方法转换为RouteRegistrar::attribute('prefix', $url)
Illuminate\Routing\Router