我有一個像這樣使用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方式中。
對不起,文字:(感謝壁提前。
該開關遠不及麪包一樣糟糕連續的if/elseif語句! –
[Symfony2和HTTP基礎知識](http://symfony.com/doc/current/book/http_fundamentals.html)是一個很好的閱讀。或[Front Controller pattern](https://en.wikipedia.org/wiki/Front_Controller_pattern)。 – Yoshi
@Yoshi我已閱讀控制器模式,你認爲這個概念適用於非mvc導向設計嗎? – ANW