Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel应用程序结构/架构_Php_Laravel_Laravel 4_Laravel Routing - Fatal编程技术网

Php Laravel应用程序结构/架构

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

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