【问题标题】:Laravel App Struture/ArchitectureLaravel 应用程序结构/架构
【发布时间】:2015-01-12 07:00:35
【问题描述】:

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

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

【问题讨论】:

标签: php laravel laravel-4 laravel-routing


【解决方案1】:

试试这个:

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

【讨论】:

  • 请注意,这会在过滤器之前/之后破坏控制器级别。
  • @ceejayoz 是的。我添加了一个可以让控制器过滤器保持工作的替代方案
  • 感谢您的回答,与我使用 atm 的方式相比,这提供了哪些优势,因为我还需要执行许多其他路线。
  • @user3134962 slug 得到验证(通过 where 条件)并且更干净,因为您的实际路线不会因请求而改变
猜你喜欢
  • 2015-12-02
  • 2018-02-02
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多