2

ajaxのコントローラー用に「catchall」メソッドを作成しています。それは「ajax」と呼ばれます:P

これが現在の様子です

public function ajax($method = null) {

    if ( ! $method OR ! request::is_ajax()) {

        return false;

    }


    if (method_exists(array($this, 'searchModel'), $method)) {
        echo $this->searchModel->$method();

    }

    exit;



}

それが明らかでない場合は、ajaxがAjaxリクエストではないと判断した場合は、最初にajaxをベイルアウトしてから$this->searchModel、ajaxメソッドの引数として渡されたメソッドがあるかどうかを確認してください。

メソッドが見つかった場合は、戻り値をエコーし​​て終了する必要があります。

私の問題はmethod_exists()、メソッドを見つけることができないことです!私はそれが存在することを知っています...私は特定の存在について知っている(テスト目的で)メソッドをハードコーディングしました。

それは私を少し狂わせてきました、誰かが私が間違っていることを私に言うことができますか?

ありがとう!

PS私はコハナフレームワークを使用していますが、それは問題ではないと思います。

アップデート

私の内部メソッド名をJavaScript(つまりパブリック)に公開することはセキュリティ上の懸念があると思いますか?

4

2 に答える 2

4

コールバック引数をサポートしているかのように最初の引数を使用していmethod_exists()ますが、コールバックを受け入れません。静的メソッドをテストするために、オブジェクトインスタンスまたはクラス名(文字列)のみを受け入れます。

これを試して:

if (method_exists($this->searchModel, $method)) {
    echo $this->searchModel->$method();
}

2番目の質問についてですが、はい、セキュリティ上の懸念があると思います。リクエストが整形式であることの検証は行っていません。私はあなたが設計している「キャッチオール」ソリューションを使用しません。

于 2009-09-15T00:58:14.783 に答える
2

私はあなたのコードが言うことになっていると思います:

if(method_exists($this->searchModel, $method))
    echo $this->searchModel->$method();

ただし、searchModelオブジェクトのすべてのメソッドをワールドに公開することはお勧めできません。そのため、ajaxメソッドに' 'ajax_などのプレフィックスを付けて、そのプレフィックスでのみメソッドを呼び出すことができるようにする必要があります。

// given that $method is 'user_login' ...
$realMethod = 'ajax_' . $method;    
if(method_exists($this->searchModel, $realMethod))
    // calls $this->searchModel->ajax_user_login();
    echo $this->searchModel->$realMethod();
于 2009-09-15T00:59:33.690 に答える