Laravel路线错误

时间:2014-06-24 11:33:10

标签: php laravel laravel-4 laravel-routing

这是我的两条路线:

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

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

Route pattern "/api/tournament/{tourId}/phase/{phaseId}/{{phaseId}}" cannot reference variable name "phaseId" more than once.

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

1 个答案:

答案 0 :(得分:5)

<强> TL; DR:

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

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

更长的版本:

要使用Route::resource(),您应该关注Resource Controllers中的文档。 E.g:

Route::resource('phase', 'PhaseController');

将生成路线网址,例如:

/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

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

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

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

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

Route::resource('phase', 'PhaseController');
Route::resource('bet', 'BetController');

并在您的控制器文件中:

PhaseController.php:

class PhaseController extends BaseController
{
    public function show($id)
    {
        // Your original PhaseController@getPhaseInfo() here
    }
}

BetController.php:

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

并像这样引用你的网址:

/phase/your_phase_id
/bet/your_bet_id

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