Laravel路线错误

vli*_*o20 0 php laravel laravel-4 laravel-routing

这是我的两条路线:

Route::resource('tournament/{tourId}/phase/{phaseId}/bets', 'PhaseController@getPhaseBets');
Route::resource('tournament/{tourId}/phase/{phaseId}', 'PhaseController@getPhaseInfo');
Run Code Online (Sandbox Code Playgroud)

但是我在尝试运行任何GET api时遇到此异常:

Route pattern "/api/tournament/{tourId}/phase/{phaseId}/{{phaseId}}" cannot reference variable name "phaseId" more than once.
Run Code Online (Sandbox Code Playgroud)

从它得到了{{phaseId}}吗?为什么我收到这个错误?!

Unn*_*wut 5

TL; DR:

由于您正在定义直接指向控制器操作的路由,因此您应该使用:

Route::get('tournament/{tourId}/phase/{phaseId}/bets', 'PhaseController@getPhaseBets');
Route::get('tournament/{tourId}/phase/{phaseId}', 'PhaseController@getPhaseInfo');
Run Code Online (Sandbox Code Playgroud)

更长的版本:

要使用Route::resource()您应该遵循资源控制器中的文档.例如:

Route::resource('phase', 'PhaseController');
Run Code Online (Sandbox Code Playgroud)

这会产生如下路线网址:

/tournament/{tourId}/phase/{phaseId}/bets
/tournament/{tourId}/phase/{phaseId}/bets/{resource_id}
/tournament/{tourId}/phase/{phaseId}/bets/{resource_id}/edit
/tournament/{tourId}/phase/{phaseId}/bets/create
Run Code Online (Sandbox Code Playgroud)

您现在会看到,而不是为资源ID提供一个参数,路由现在最多有3个参数.这让Laravel对应该使用哪一个作为资源ID感到困惑.

由于您正在定义直接指向控制器操作的路由,因此您应该使用:

Route::get('tournament/{tourId}/phase/{phaseId}/bets', 'PhaseController@getPhaseBets');
Route::get('tournament/{tourId}/phase/{phaseId}', 'PhaseController@getPhaseInfo');
Run Code Online (Sandbox Code Playgroud)

如果您仍然想使用资源控制器,则需要将代码更改为此类代码.

Route::resource('phase', 'PhaseController');
Route::resource('bet', 'BetController');
Run Code Online (Sandbox Code Playgroud)

并在您的控制器文件中:

PhaseController.php:

class PhaseController extends BaseController
{
    public function show($id)
    {
        // Your original PhaseController@getPhaseInfo() here
    }
}
Run Code Online (Sandbox Code Playgroud)

BetController.php:

class BetController extends BaseController
{
    public function show($id)
    {
        // Your original PhaseController@getPhaseBets() here
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样引用你的网址:

/phase/your_phase_id
/bet/your_bet_id
Run Code Online (Sandbox Code Playgroud)

显然这可能不完全符合您的要求.如果你能解释一下锦标赛,阶段,投注和你想要达到的目标之间的关系,也许我们可以建议一个更好的方法.