【问题标题】:Laravel routing to wrong controller methodLaravel 路由到错误的控制器方法
【发布时间】:2017-12-16 13:27:27
【问题描述】:

我有以下两条路线:

路线1:

Route::get(config('api.basepath') . '{username}/{hash}/{object_id}', [
    'action' => 'getObject',
    'uses' => 'ObjectController@getObject',
]);

路线2:

Route::get(config('api.basepath') . 'object-boxes/{object_id}/boxes', function () {
    if (Input::get('action') == 'filter') {
        return App::call('App\Http\Controllers\FilterController@getFilteredContents');
    } else {
        return App::call('App\Http\Controllers\ObjectBoxController@show');
    }
});

现在,

Route 1 可带或不带 Auth 中间件,而 Route2 位于 Auth 中间件下。

但是,在任何一个调用中,执行控制都将交给 ObjectController@getObject

当我将 Route1 移到 Route2 下方时,每次调用都会转到 ObjectBoxController@show。

我尝试了 Preceed,但没有任何改变。 我该如何解决这个问题

【问题讨论】:

  • 为了方便起见,您可以使用 "prefix" => config('api.basepath') 定义一个路由组(或使用现有的 api 路由组),而不是对 api 路径进行那种尴尬的串联。

标签: php laravel routing laravel-5.4 laravel-routing


【解决方案1】:

您的第一条和第二条路线相似,

第一条路线

config('api.basepath') . '{username}/{hash}/{object_id}'

第二条路线

config('api.basepath') . 'object-boxes/{object_id}/boxes'

当你有第二条路线的情况下,它被视为前一种,并将username作为object-boxesobject_id作为boxes。因此,两种情况都调用了相同的函数。因此,请为这两条路线尝试不同的路线模式。

【讨论】:

  • 谢谢 Sagar,我明白了原因.. 但是这些路线是客户提供的,因此需要一个解决方案来区分它们。
  • 恭喜兄弟,你的问题已经解决了
【解决方案2】:

您应该定义路由中的变量,而不是每个路由末尾的where

Route::get(config('api.basepath') . '{username}/{hash}/{object_id}', [
    'action' => 'getObject',
    'uses' => 'ObjectController@getObject',
])->where('object_id', '[0-9]+');

Route::get(config('api.basepath') . 'object-boxes/{object_id}/boxes', function () {
    if (Input::get('action') == 'filter') {
        return App::call('App\Http\Controllers\FilterController@getFilteredContents');
    } else {
        return App::call('App\Http\Controllers\ObjectBoxController@show');
    }
})->where('object_id', '[0-9]+');

您可以使用路由实例上的 where 方法来限制路由参数的格式。 where 方法接受参数的名称和定义如何约束参数的正则表达式:

Read the documentation here

【讨论】:

  • 不错!还要记住Sagar Gautam 发布的内容!这是您的问题存在的主要原因!
  • @DouwedeHaan 我已经讨论过问题,但这是处理此类问题的正确方法。
  • @SagarGautam,没错,但你解释一下为什么会发生,如果你想下次避免它,这也很重要!
  • 太好了,干杯:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 2016-07-23
  • 1970-01-01
  • 2018-06-10
  • 2020-11-18
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多