2013-12-16 51 views
0

我有一個像這樣使用URL在我的網站網頁:OOP/Maintainble替代包括switch語句的網頁

http://example.com/index.php?page=about 
http://example.com/index.php?page=portofolio 
http://example.com/index.php?page=location 
http://example.com/index.php?page=mission 
http://example.com/index.php?page=contact 
http://example.com/index.php?page=register 
http://example.com/index.php?page=login 

現在,目標是包括是它包含了關於一個簡單的文本的簡單about.html頁公司或調用?page=register時稱爲register.php的表單處理器文件。

這是我如何處理的內容。

$id= isset($_GET && !empty($_GET['page'])) ? htmlspecialchars($_GET['page']) : false; 

switch($id){ 
    case 'about': 
    include 'about.html'; 
    break; 

    case 'porofolio': 
    include 'portofolio.html'; 
    break; 

    case 'contact': 
    include 'contact_form.html'; 
    include 'contact_process.php'; 
    break; 

    case 'login': 
    if(isset($_SESSION['user_login'])){ 
     echo 'You are already logged in'; 
    }else{ 
    include 'login_form.html'; 
    include 'login_process.php'; 
    } 

    default: 
    die('Page not found'); 
    break; 

} 

是的,我知道這太可怕了。我知道相信我。這就是爲什麼,我需要更好的可維護解決方案。

現在,如果你只是好奇,這可能是內部process_login.php它看起來像:

if($_POST){ 
    if(!empty($_POST['username']) && !empty($_POST['password'])){ 
    try{ 
     $pdo = new PDO(...); 
     $stmt = $pdo->prepare("SELECT id FROM users WHERE username = ? AND password = ?"); 
     if($stmt->rowCount(){ 
      $_SESSION['user_login'] = $_POST['username']; 
      header('location: success.php'); exit; 
      } 
     } 
    } 


} 

這只是一個例子,我很快寫了,所以可能有一些錯字或我已經離開了另一件事。我有興趣知道如何更好地創建/模擬處理轉換語句的做法,因爲在我看來,對於這樣的任務似乎不是一種好的面向對象的方法。我想要一些可維護,可擴展的方法。

如果你在爲什麼我只有一個頁面index.php,那是因爲我不想爲所有頁面創建靜態頁面,因爲它們具有相同的佈局,使得HTML的改進更容易。而不是有一天,打開7個文件來改變/添加一個標籤,這是有道理的只做一次。

第二,如果你爲什麼選擇包含about.html頁面而不是簡單地將純文本存儲在數據庫中,那是因爲我不想爲10行簡單文本創建一個字段/表/連接,因爲我會節省一些開銷表現。 (雖然我相信,你可能不會同意這一點)

所以,一般的問題是,如何擺脫switch語句的複雜性,這使得我最終創建像login_process.php這樣的文件而不是處理它,在一些我不知道的OOP方式中。

對不起,文字:(感謝壁提前。

+0

該開關遠不及麪包一樣糟糕連續的if/elseif語句! –

+0

[Symfony2和HTTP基礎知識](http://symfony.com/doc/current/book/http_fundamentals.html)是一個很好的閱讀。或[Front Controller pattern](https://en.wikipedia.org/wiki/Front_Controller_pattern)。 – Yoshi

+0

@Yoshi我已閱讀控制器模式,你認爲這個概念適用於非mvc導向設計嗎? – ANW

回答

1

,你正在尋找的解決方案是真正的MVC和模板的意見。此外,你基本上創建自己的路由器,你的路由器與一些主要框架中的一些複雜路由方案相比,它非常簡單,所以如果你想進一步簡化,那將是一件相當困難的事情。

如果你想看看這是如何完成的以非常OOP的方式,檢出類似於Zend Framework 2,CakePHP等的東西。

+0

我真的很討厭框架。他們爲這個簡單的項目添加了不必要的複雜性。我不想爲簡單的網站運行20個庫,另外,當我創建一個網站時,我想知道該流程背後的位置以及發生了什麼。但謝謝你的迴應。 – ANW

+1

我有同樣的感覺。但是,在圍繞幾個框架包裝我的頭後,我的生產力大大提高了。學習曲線確實是令人討厭的部分。 – user602525

+0

是的,但應該有一些替代品不支持MVC設計模式的想法。 – ANW