Php Laravel应用程序结构/架构
我正在写一个Laravel应用程序,它基本上允许你以各种格式运行比赛。现在我的问题是,我想为每一种不同的比赛形式选择相同的路线。每种格式都有非常不同的逻辑和视图 起初,我只有一个TournamentController,并在每个函数中使用if语句来检查类型并执行适当的逻辑,例如:Php Laravel应用程序结构/架构,php,laravel,laravel-4,laravel-routing,Php,Laravel,Laravel 4,Laravel Routing,我正在写一个Laravel应用程序,它基本上允许你以各种格式运行比赛。现在我的问题是,我想为每一种不同的比赛形式选择相同的路线。每种格式都有非常不同的逻辑和视图 起初,我只有一个TournamentController,并在每个函数中使用if语句来检查类型并执行适当的逻辑,例如: public function start($tournamentId){ $tournament = Tournament::find($tournamentId); if($tournament
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和RoundRobInControl,在routes文件中,我通过如下操作使控制器成为动态的:
$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中可能会有问题。e、 g.单一消除
编辑
如果你有控制器过滤器,或者想做得更“干净”
请注意,这会中断过滤器之前/之后的控制器级别。@ceejayoz这是真的。我添加了一个替代方案,可以让控制器过滤器保持工作状态。答案是,与我使用atm的方式相比,这有什么优势,因为我还需要为许多其他路径执行此操作。@user3134962 slug得到验证(通过where条件)它更干净,因为您的实际路由不会从一个请求更改为另一个请求。值得注意的是:@cwallenpole,嗯。。OP甚至没有发现使用全局作用域的问题。我怀疑你的链接材料会有任何影响。@tereško请随意发表更多有用的评论
return App::make($controllerName)->callAction('showTournament', array($tournamentId));