我正在编写一个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
}
}
现在我意识到,当我添加更多的锦标赛类型时,在锦标赛控制器的每个函数中都有这种类型的逻辑会变得混乱。因此,我创建了两个单独的控制器,SingleEliminationController 和 RoundRobinController,在路由文件中,我通过执行以下操作使控制器动态化:
$tournament = Tournament::find(Request::segment(2));
$controller = str_replace(' ', '', $tournament->tournamentType());
Route::get('{tournamentId}/{slug}', $controller . 'Controller@showTournament')->where('tournamentId', '[0-9]+');
这似乎更容易管理,但它似乎仍然有点笨拙,我相信一定有更好的方法来构建事物,但我无法弄清楚。任何帮助将不胜感激,谢谢!
试试这个:
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 条件,因此,如果输入的类型不存在,则会跳过该路由。
顺便说一句:我建议您将锦标赛类型更改为没有空格的内容,因为它们在 url 中可能会出现问题。 single-elimination
编辑
如果您有控制器过滤器,或者想做得更"干净"
return App::make($controllerName)->callAction('showTournament', array($tournamentId));