【问题标题】:Laravel 5.4 route group and resource mess up the parametersLaravel 5.4 路由组和资源弄乱了参数
【发布时间】:2017-09-11 10:59:33
【问题描述】:

这个资源定义不错:

Route::resource('servers', 'ServerController');

给予:

+--------+-----------+-----------------------+-----------------+-----------------------------------------------+--------------+
| Domain | Method    | URI                   | Name            | Action                                        | Middleware   |
+--------+-----------+-----------------------+-----------------+-----------------------------------------------+--------------+
|        | GET|HEAD  | servers               | servers.index   | App\Http\Controllers\ServerController@index   | web          |
|        | POST      | servers               | servers.store   | App\Http\Controllers\ServerController@store   | web          |
|        | GET|HEAD  | servers/create        | servers.create  | App\Http\Controllers\ServerController@create  | web          |
|        | GET|HEAD  | servers/{server}      | servers.show    | App\Http\Controllers\ServerController@show    | web          |
|        | PUT|PATCH | servers/{server}      | servers.update  | App\Http\Controllers\ServerController@update  | web          |
|        | DELETE    | servers/{server}      | servers.destroy | App\Http\Controllers\ServerController@destroy | web          |
|        | GET|HEAD  | servers/{server}/edit | servers.edit    | App\Http\Controllers\ServerController@edit    | web          |
+--------+-----------+-----------------------+-----------------+-----------------------------------------------+--------------+

但我需要将它包装成一个前缀如下的组:

Route::group(['prefix' => 'servers'], function()
{
    Route::resource('/', 'ServerController', ['names' => 'servers']);
});

问题来了,因为前缀参数化路由的参数是空的:

+--------+-----------+-----------------+-----------------+-----------------------------------------------+--------------+
| Domain | Method    | URI             | Name            | Action                                        | Middleware   |
+--------+-----------+-----------------+-----------------+-----------------------------------------------+--------------+
|        | GET|HEAD  | servers         | servers.index   | App\Http\Controllers\ServerController@index   | web          |
|        | POST      | servers         | servers.store   | App\Http\Controllers\ServerController@store   | web          |
|        | GET|HEAD  | servers/create  | servers.create  | App\Http\Controllers\ServerController@create  | web          |
|        | GET|HEAD  | servers/{}      | servers.show    | App\Http\Controllers\ServerController@show    | web          |
|        | PUT|PATCH | servers/{}      | servers.update  | App\Http\Controllers\ServerController@update  | web          |
|        | DELETE    | servers/{}      | servers.destroy | App\Http\Controllers\ServerController@destroy | web          |
|        | GET|HEAD  | servers/{}/edit | servers.edit    | App\Http\Controllers\ServerController@edit    | web          |
+--------+-----------+-----------------+-----------------+-----------------------------------------------+--------------+

所以servers/1 变成了 404。有什么办法可以解决这个问题吗?

【问题讨论】:

  • 要声明一个资源路由,需要将资源名称,即servers传递给资源方法。
  • 为什么要打包成组?从我可以看到它已经在一个组中。
  • @TheAlpha 是的,但在这种情况下我不能使用前缀。我已经检查了核心,并且有一个prefixedResource 方法,所以我希望如果资源的名称只是一个/,它可以使用名称的前缀。但似乎不是。顺便说一句,谢谢你的回答。
  • @PankitGami Group 因为中间件和命名空间而需要。

标签: php laravel laravel-5 routing laravel-routing


【解决方案1】:

您可以使用方法parameters 自定义路由中的所有参数。 示例:

Route::prefix('teams')->group(function () {
  Route::resource('', 'TeamController')->parameters(['' => 'team']);
});

【讨论】:

    【解决方案2】:

    根据您的 cmets:

    您想将命名空间和中间件添加到资源路由。您可以通过在资源控制器的第三个参数中添加 middlewarenamespace 键来实现此目的,如下所示。

    Route::resource('servers', 'ServerController', ['middleware' => 'xyz', 'namespace' => 'xyz']);
    

    编辑:

    如果命名空间不起作用,您可以为控制器分配一个命名空间。

    Route::resource('servers', 'Xyz\ServerController', ['middleware' => 'xyz']);
    

    【讨论】:

    • 我已经检查过了,不,命名空间没有作为资源参数工作。我已经设置它并且仍然提供默认命名空间:App\Http\Controllers\ServerController@index
    • @MrRP 尝试使用大写字母“Servers”中的“servers”文件夹。如 PSR-4 中所述:子目录名称必须与子命名空间名称的大小写匹配。
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2015-10-25
    • 2018-04-07
    • 2021-05-24
    • 1970-01-01
    • 2018-12-30
    • 2017-07-21
    • 2018-10-04
    相关资源
    最近更新 更多