2009-05-27 17 views
1

私はPHPベースのCMSを開発していますが、現在私は顧客に利用可能な状態に書き直しています。 (私の最初のバージョンは、内部だったとややクルージ的混乱:P)堅牢なPHPポストバックハンドラを開発する

私の最初のバージョンでは、私は$ _POST変数のかなりの数のexistanceをチェックHandlePostBackという関数を()持っていた - ボタンを提出します可能な各形式から選択します。設定されていれば、適切なコマンドが実行されます。

もっと良い方法があるのでしょうか?私はスイッチに移行し、各フォームに含まれている$ _POST変数を探して、コマンドを実行することができます。最低限のコードはすばらしく、システムをすばやく簡単に拡張できます。

答えて

2

あなたのフォームシステムは少し改造をしているようです。それぞれのフォームをクラスとして表現し、HandlePostBackの機能をメソッドにするのはなぜですか?次に、送信されたフォームを検出して処理できます。私は通常、隠し入力「form_action」を使用似たようなケースで

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

1

私はそれをやり直そうとします。 すべての投稿に中心点が必要なのはなぜですか?これは本当に悪い習慣です。

これ以上改善しようとしないでください。中心点を持っているというアイデアを再考して、それを取り除いてみてください。

0

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のようなものを標準フォーマットを使用する場合は、提出の上にこのような何かを行うことができますので、私は

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

はその後、サーバー側で私がして、アクションを分割することができます(など...「削除」、「編集」「を追加」のような)異なるアクションを提供するために、異なる提出-ボタンを使用することができます"_"を使用し、フォームクラス識別子として1番目の部分を使用します。単純なスイッチやリフレクションなど)、2番目の部分は、ポストバックデータを処理するフォームクラスのメソッドを指定します。一般的なコードは次のようなものです

$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が利用可能で有効であることに不必要に頼っているようです。 –

+0

ボタン名を使用するだけではどうですか?HTMLでを使用して、次のようにチェックします:if(isset($ _ POST ['class_delete']){new Class() - > delete($ _ POST 、$ other_params);} –

+0

あなたはそれを好きなだけ使うことができますが、私はボタンのためにonClickハンドラを作成することを好む。複雑なプロジェクトでは、多くの場合、 – Jet

0

このようなことをする1つの方法は、あなたの要求をクラスにルーティングし、$_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をご覧ください。

関連する問題