Laravel路由:prefix()方法在哪里定义?

时间:2018-12-04 07:27:27

标签: laravel laravel-5 laravel-5.4 laravel-routing

在我的示例中,我定义了一条路线:

Route::prefix('home')->group(function(){
    Route::get('/test',....);
});

当我访问mydomain/home/test,时,它可以工作。但是,我不知道prefix方法的位置。我认为它可能位于Illuminate\Routing\Route.php.中,但是当我删除该方法上的prefix方法时,它仍然有效吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

prefix方法位于Illuminate\Routing\Router类中。

在典型的Laravel 5应用程序中,绝对路径为:

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

如何找到它?

您可能知道,当您编写Route::时,实际上是在使用名为Route的Laravel门面。从那里可以在https://laravel.com/docs/5.4/facades#facade-class-reference的Laravel 5.4的官方文档中找到Facade类参考。这是您要查找的行:

---------------------------------------------------------------
|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方法返回$this,因此group@RouteRegistrar方法被调用
  4. group@RouteRegistrar方法调用group@Router方法
  5. 调用loadRoutes@Router方法。它将解析闭包中存在的所有路由,即Route::get('/test', ...);
  6. 这次,在get立面下面的类Route上调用Router方法。 get@Router方法已执行
  7. addRoute@Router被调用,依次调用createRoute@Router方法
  8. createRoute@Router调用带有前缀URI作为第二个参数的newRoute@Router

您会注意到,prefix@Router方法调用getLastGroupPrefix@Router显然会检索最后一组的前缀。

答案 2 :(得分:0)

@louisfischer答案不正确。根本没有调用Router::prefix

prefix调用RouteRegistrar方法,该方法最终转发到RouteRegistrar::attribute方法

您可以通过查看Illuminate\Support\Facades\Route文档块来验证这一点。

* @method static \Illuminate\Routing\RouteRegistrar prefix(string  $prefix)

这是完整的流程:

  1. Route外观首先通过Illuminate\Routing\Router将呼叫转发到Facade::__callStatic
  2. 由于Router::prefix不是public方法,而是protected方法,因此此调用通过RouteRegistrar::attribute方法转发到Router::__call
  3. 最后,prefix($url)方法将转换为RouteRegistrar::attribute('prefix', $url)