如何重构长前控制器?

时间:2009-09-17 01:08:28

标签: php refactoring front-controller

我正在使用Front Controller通过一系列问题向用户发送信息。几乎所有东西都必须是动态的,因为页面,问题和其他一切都在管理界面中设置并存储在数据库中。

我通过在会话中存储唯一标识符并将用户所在的当前页面存储在数据库中来跟踪用户在数据库中的进度,以便我可以找出要发送给他们的下一页。

问题是,有很多特殊情况要检查。现在控制器超过300行,代码编写得很糟糕,而且我是编写代码的人。此外,我将需要在接下来的几周内为该系统添加更多内容,例如用户生成的内容和根据用户来自哪里显示的不同页面。

我可以看到,如果我不能很好地组织它,这个控制器会变得很快。

重构这个有什么好方法或想法?

1 个答案:

答案 0 :(得分:2)

通常,使用URL来确定应该发送给客户端的内容会更容易。如果您的问题是通过<form>提交的,则您可以在保存答案后返回重定向到下一个问题。例如,如果这是您的一个问题:

<form action="/questions/14" method="post">...

这会提交给/questions/14,一旦您保存了答案,您就可以重定向到问题15:

header('Location: /questions/15');
exit;

准备好网址后,您可以将前端控制器拆分为与每个问题相关的部分。然后你需要的只是一些路由:

if(preg_match('/\/questions\/([0-9]+)/',$_SERVER['REQUEST_URI'],$matches) > 0) 
{
    $question_num = (int)$matches[1];
    if(!in_array($question_num, $valid_questions)) {
        // return 404
    }

    $controller_name = 'Question_' . $question_num;
    return new $controller_name; 
} 
else // check for urls that aren't questions ...