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\Routerclass.

典型 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                    |
---------------------------------------------------------------

流量

  1. (受保护的)prefix 方法由 __call@Router 处理。 return (new RouteRegistrar($this))->attribute($method, $parameters[0]);被执行
  2. 调用attribute@RouteRegistrar方法并将元素'prefix' => 'home'添加到$this->attributes数组
  3. 由于attribute@RouteRegistrar方法returns$this,调用了group@RouteRegistrar方法
  4. group@RouteRegistrar方法调用group@Router方法
  5. 调用了loadRoutes@Router方法。它将解析闭包中存在的所有路由,即 Route::get('/test', ...);
  6. 这次 get 方法在 Route 门面下的 class 上调用,即 Router class。 get@Router方法执行
  7. addRoute@Router 被调用,后者又调用 createRoute@Router 方法
  8. 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)

完整流程如下:

  1. Route facade首先通过Facade::__callStatic.
  2. 将调用转发给Illuminate\Routing\Router
  3. 因为Router::prefix不是public方法而是protected方法,所以这个调用通过Router::__call方法转发给RouteRegistrar::attribute
  4. 最后prefix($url)方法转换为RouteRegistrar::attribute('prefix', $url)