Laravel App结构/架构

时间:2014-11-14 19:37:02

标签: php laravel laravel-4 laravel-routing

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

这似乎更易于管理,但它看起来仍然有点笨拙,我确信必须有更好的方法来构建事物,但我无法弄明白。任何帮助将不胜感激,谢谢!

1 个答案:

答案 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));