Laravel应用程序结构/架构


Laravel App Struture/Architecture

我正在编写一个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));