【问题标题】:How to refactor long Front Controller?如何重构长前端控制器?
【发布时间】:2009-09-17 01:08:28
【问题描述】:

我正在使用前端控制器向用户发送一系列带有问题的页面。几乎所有内容都必须是动态的,因为页面、问题和其他所有内容都在管理界面中设置并存储在数据库中。

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

问题是,有很多特殊情况需要检查。现在控制器有超过 300 行长,代码写得不好,我是写它的人。另外,在接下来的几周内,我需要向这个系统添加更多内容,例如用户生成的内容和根据用户来自哪里显示的不同页面。

我可以看到,如果我组织得不好,这个控制器很快就会变得一团糟。

有什么好的方法或想法来重构它?

【问题讨论】:

    标签: php refactoring front-controller


    【解决方案1】:

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

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

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

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

    一旦您有了 URL,您就可以将前端控制器拆分为与每个问题相关的部分。那么你所需要的只是一些路由:

    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 ...
    

    【讨论】:

    • 似乎完全正确。每个问题都应该是它自己的控制器动作。处理响应,并重定向到下一个问题。 Protip:如果特定答案需要跳过下一个问题,请不要使用幻数。而是重定向到 $thisQuestionNum+2。
    • 谢谢!我做了一些不同的事情——所有的表单仍然发布到前端控制器——但是现在每个页面控制器都有一个前端控制器调用的 handlePost() 方法。在数据库中,页面控制器类没有与模板文件一起存储,因此前端控制器确定用户当前所在的页面,加载控制器,检查是否有 POST 数据,然后调用页面加载视图。这将前端控制器的行数从 300 多行减少到 30 行以下!
    猜你喜欢
    • 2011-01-04
    • 1970-01-01
    • 2011-07-04
    • 2015-11-30
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2011-01-15
    • 2013-11-20
    相关资源
    最近更新 更多