2009-05-27 43 views
1

我正在開發一個基於PHP的CMS,我目前正在將它重新寫入一個可供客戶使用的狀態。 (我的第一個版本是內部的;有點kludgy混亂:P)開發一個強大的PHP回發處理程序

在我的第一個版本中,我有一個名爲HandlePostBack()的函數檢查是否存在大量的$ _POST變量 - 提交按鈕從每種可能的形式。如果已設置,則會執行相應的命令。

我想知道是否有更好的方法?我可以遷移到一個開關,然後查找每個表單中包含的一個$ _POST變量,然後執行該命令。最少的代碼會很好,所以我可以快速輕鬆地擴展系統。

回答

2

在我看來,你的表單系統可能會使用一點改進。爲什麼不將每個表單都表示爲一個類,並使HandlePostBack函數成爲一種方法?然後你可以檢測到已經提交的表單並處理它。

class ProfileForm extends Form { 
    private $form_items = array(
     new FormItem('name', 'datatype', 'other_parameters'), 
     new FormItem('another_name', 'datatype', 'other_parameters'), 
     ... 
    ); 

    public function render() { 
     ... 
    } 

    public function handlePostData() { 
     ... 
    } 
} 

如果您使用的是標準格式爲您提交按鈕的ID(類似<form_name>_submit,你可以做的提交是這樣的:

foreach ($_POST as $key => $value) { 
    if (substr($key, strlen($key) - 7) == '_submit') { 
     $className = ucfirst(substr($key, 0, strlen($key) - 7)) . 'Form'; 
     $form = new $className(); 
     $form->handlePostBack(); 
    } 
} 
+0

這正是我所期待的。這裏也有一些其他感興趣的想法。 – EvilChookie 2009-05-28 05:58:35

1

我會盡力改變它。 爲什麼你需要一箇中心點爲你的所有帖子?這是非常糟糕的做法。

不要試圖改善它,嘗試重新思考有一箇中心點,擺脫它的整個想法。

0

在類似的情況下,我通常使用隱藏的輸入「form_action」 ,所以我可以使用不同的提交,按鈕,提供不同的操作(如「添加」,「編輯」,「刪除」等)

<input type="submit" onclick="assignAction(this.form, 'myItem_delete');"...> 

然後在服務器端,我可以通過拆分行動「_」並使用第一部分作爲表單類別標識符(即,對於簡單的切換或反射...),第二部分說明了什麼樣的方法應該處理回發數據。在常見的代碼是這樣的

$handler = explode('_', $_POST['form_action']); 
$className = $handler[0]; // not secure, but simple enough for example 
if (class_exists($className)) 
{ 
    $form = new $className(); 
    $method = $handler[1]; // again too simple 
    if (method_exists($form, $method)) 
    { 
     $form->$method($_POST, $other_params...); 
    } 
} 

當然,這個例子太簡單了。但這是常見的想法很好,就我而言。

+0

有一個隱藏的「動作」元素的一般想法很常見,但你的方法似乎不必要地依賴於JavaScript可用和啓用 – 2009-05-27 18:24:06

0

做這種事情的一種方法是將您的請求路由到類,如果$_SERVER['REQUEST_METHOD'] == 'POST'然後調用該類的post()方法。這意味着你的表單上的動作會直接映射到某個具有post方法的類。

// routed from URL: /users 
class Users implements Resource 
{ 
    public function post() 
    { 
     // do your post here 
    } 

    public function get() 
    { 
     // do it for GET requests too 
    } 
} 

雖然這在本質上是一樣的東西,你以前是做什麼的,它可以讓你組織你的代碼是一個更好一點,你可以處理在一個通用的方式請求:

$resource = $resourceFactory->getResource($url); 
$method = strtolower($_SERVER['REQUEST_METHOD']); 
$response = $resource->$method(); // eg: $resource->post(); 
$response->respond(); 

看看recess framework這個想法很長。

相關問題