【问题标题】:Laravel Routing: Where is the prefix() Method Defined?Laravel 路由:prefix() 方法定义在哪里?
【发布时间】:2019-05-05 13:44:42
【问题描述】:

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

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

当我访问mydomain/home/test, 时,它可以工作。但是,我不知道prefix 方法在哪里。我想它可能在Illuminate\Routing\Route.php. 但是当我删除prefix 方法时,它仍然有效吗?

【问题讨论】:

  • 你能清除你的路由列表缓存吗?
  • 是的,我只是php artisan route:cache,但结果相同

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


【解决方案1】:

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

【讨论】:

  • 嗨,我使用 Laravel 5.4,但我想知道 prefix 方法定义在哪里?
  • 我深入研究了prefix 方法,它来自_ide_helper.php,它是这样说的:@method static \Illuminate\Routing\RouteRegistrar prefix(string $prefix)
  • 我在\Illuminate\Routing\RouteRegistrar中找不到_ide_helper.php文件和prefix方法
  • OP 没有询问使用什么代码。他在问prefix 方法在哪里定义以及为什么。
【解决方案2】:

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 |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 调用 newRoute@Router 并将前缀 URI 作为第二个参数

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

【讨论】:

  • 但是在Illuminate\Routing\Router前缀方法中返回string?但我认为它必须返回class
  • 我知道你可能认为它必须返回类本身,因为方法链。但这要归功于Macroable trait。检查 this concise article 作为 Laravel Macroable trait 的介绍。
  • 不,这是不正确的。 Macroable 仅在我们调用Route::macro 时有效。实际上Router类中的prefix方法并没有在Route::prefix上调用。
  • 您刚刚更改了整个答案的含义,因为您已经意识到我的答案是正确的,而您的原始答案是错误的。哇!伟大的体育精神!
  • 我从未修改过任何内容,只是添加了一些内容以使其更清晰。您可以检查修订;)
【解决方案3】:

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

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

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

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

这是完整的流程:

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

【讨论】:

  • \Illuminate\Routing\RouteRegistrar 是返回类型。检查this Stack Overflow answer 关于@method 标签。
  • 这正是我的观点。它是返回类型,因为RouteRegistrar::attribute 返回$this。而您建议 Router::prefix 的返回类型是字符串而不是 RouteRegistrar。你的答案是错误的。
  • 我猜你甚至没有阅读 OP 问题。他问在哪里可以找到prefix 方法。我的回答正确而简单:在Illuminate\Routing\Router 类中
  • 不,他的意思是在哪里可以找到被调用的Route::prefix 方法。那是指RouteRegistrar::attributeRouter::prefix 甚至没有被 Route::prefix 调用,并且与问题完全无关。
  • 谢谢@louisfischer 和帕拉斯。这就是我要找的:)
猜你喜欢
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 2018-03-19
  • 2017-08-29
  • 1970-01-01
  • 2017-10-07
相关资源
最近更新 更多