2009-09-17 76 views
0

我正在使用Front Controller通過一系列帶有問題的頁面向用戶發送消息。幾乎所有的事情都必須是動態的,因爲頁面,問題和其他所有內容都在管理界面中設置並存儲在數據庫中。如何重構長前端控制器?

我通過在會話中存儲唯一標識符並將用戶所在的當前頁面存儲在數據庫中來跟蹤用戶通過數據庫的進度,以便我可以找出將它們發送到的下一頁。

事情是,有很多特殊情況下檢查。現在控制器長度超過300行,代碼寫得不好,我是寫它的人。另外,我將需要在即將到來的幾周內爲此係統添加更多內容,例如用戶生成的內容和不同的頁面,以顯示取決於用戶來自何處的內容。

我可以看到,如果我沒有很好地組織它,這個控制器會變得很快。

有什麼好的辦法或思路,重構呢?

回答

2

通常,使用URL可以更容易地確定要發送給客戶端的內容。如果您的問題是通過<form>提交的,您可以在保存答案後將重定向返回到下一個問題。例如,如果這是你的問題之一:

<form action="https://stackoverflow.com/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 ... 
+1

看起來完全正確。每個問題應該是它自己的控制器行爲。處理響應,並重定向到下一個問題。 Protip:如果某個特定答案需要跳過下一個問題,請不要使用幻數。相反,重定向到$ thisQuestionNum + 2。 – timdev 2009-09-17 04:05:27

+0

謝謝!我做了一些有點不同的事情 - 所有表單仍然發佈到前端控制器 - 但現在每個頁面控制器都有一個前端控制器調用的handlePost()方法。在數據庫中,頁控制器類是與模板文件一起沒有存儲的,從而前端控制器計算出當前頁面的用戶是上,裝入控制器,檢查是否有POST數據,然後調用頁面加載視圖。 這種減小的前端控制器從超過300線至下30! – 2009-09-18 19:24:04