我正在编写一个Laravel应用程序,它基本上允许您以各种格式运行锦标赛。现在我遇到的问题是我想为每种不同的锦标赛格式提供相同的路线。每种格式都有不同的逻辑和视图。
首先我只有一个TournamentController并在每个函数中使用if语句来检查类型并执行适当的逻辑,例如:
public function start($tournamentId){
$tournament = Tournament::find($tournamentId);
if($tournament->type == "single elimination"){
//single elimination logic
}elseif($tournament->type == "round robin"){
//round robin logic
}
}
现在我意识到,当我添加更多锦标赛类型时,在TournamentController中的每个函数中都有这种类型的逻辑会变得混乱。然后我创建了两个独立的控制器,SingleEliminationController和RoundRobinController,并在路径文件中通过执行以下操作使控制器动态化:
$tournament = Tournament::find(Request::segment(2));
$controller = str_replace(' ', '', $tournament->tournamentType());
Route::get('{tournamentId}/{slug}', $controller . 'Controller@showTournament')->where('tournamentId', '[0-9]+');
这似乎更易于管理,但它看起来仍然有点笨拙,我确信必须有更好的方法来构建事物,但我无法弄明白。任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
试试这个:
Route::get('{tournamentId}/{tournamentType}', function($tournamentId, $tournamentType){
$controllerName = studly_case($tournamentType).'Controller';
return App::make($controllerName)->showTournament($tournamentId);
})->where(array(
'tournamentId' => '[0-9]+',
'tournamentType' => '(single elimination|round robin)'
));
将每个tournamentType
添加到where条件,因此如果输入的类型不存在,则会跳过该路径。
顺便说一句:我建议您将锦标赛类型更改为没有空格的内容,因为它们可能会在网址中出现问题。例如single-elimination
修改强>
如果你有控制器过滤器,或者想要更多“干净”
return App::make($controllerName)->callAction('showTournament', array($tournamentId));