0

私は Web アクセス可能な API に取り組んでおり、関数パラメーターとして $_POST / $_GET 変数を割り当てる最も効率的で効率的な方法を見つけようとしています。変数をパラメーターのデフォルトとして使用できないことはわかっているので、目標は DRY (Don't Repeat Yourself) です。アプリケーション内と外部インターフェースの両方から API 関数を使用できるようにします。

バックグラウンド:

1)現在、API 関数は public static メソッドを持つクラスに編成されています。リモート リクエストが行われると、リクエストされたクラスとメソッドが (安全に) 決定され、クラスとメソッドの組み合わせが有効な場合は、 を使用して呼び出されcall_user_func("$class::$method")ます。

2)最終的に呼び出しを行うコードclass::method()は、意図的に馬鹿げています。関数が受け取るパラメーターを認識していないか、気にしていません。パラメータが欠落している関数は呼び出すことができないため、API 内のすべての関数は、パラメータを持たないか、デフォルトのパラメータを持たない必要があります。ここで行う最もクリーンな方法は、必要なパラメーターをデフォルトの で定義し、null関数に $_POST 変数の割り当てを内部的に処理させることだと考えました。

public static function complete($id = null, $offset = 0, $limit = 50){ ... }

3)内部的には、API メソッドは通常の PHP 変数を返し、外部インターフェイスはこの値を でエンコードしますjson_encode()

私が今持っているものはうまくいきます:

最初は、関数ごとに 10 行以上の余分な行を必要とする怪物をいくつか試しましたが、再利用可能な関数に絞り込みました。私は見ましextract()たが、私の目的には十分に正確でも安全でもありませんでした。

function assign($postIndex, &$target, $require = true){
    // Any code assigned parameter overrides remote values
    if($target != null && $require == true)
        return;

    // Force parameter requirement if specified
    if($require && !isset($_POST[$postIndex]))
        throw new MissingParameterException();

    // Assign to referenced variable if it's set
    if(isset($_POST[$postIndex]))
        $target = $_POST[$postIndex];
}

次のように使用します。

public static function delete($id = null){
    assign('id', $id);

    ...

}

インジェクションの潜在的な脆弱性を認識していることに注意してください。すべての API 関数は、元の場所に関係なく、パラメーターを消去します。また、このメソッドを使用して API の関数を作成する他の人がパラメーターが安全であると想定している可能性があることも認識していますが、assign()明示的に呼び出す必要があるため、これはやや無効だと思います (関数の名前が変更された場合はさらにそうです assign_raw_post_var_to_param()) - それは本質的に次のように明示的です書き込み$name = $_POST['name'];

質問...

$_POST / $_GET 変数を関数パラメーターに割り当てて、関数を外部インターフェイスとコードから透過的に呼び出すことができるようにするより良い方法はありますか? もしそうなら、どのように実装しますか?

4

1 に答える 1

1

が必要だと思いますcall_user_func_array。これを使用して、パラメーターの配列を指定できるため、プレーンなメソッド シグネチャを保持できます。

パラメータの順序がわからず、ランタイムかどうかを判断する必要がある場合は、リフレクションを使用して行うことができます。


OPによる編集:

リフレクションは優れたソリューションです。例えば:

class TestClass {
    public static function some_method($name, $email, $bannana){

    }
}

$reflection = new ReflectionMethod('TestClass', 'some_method');
$params = $reflection->getParameters();

$params次のようになります。

Array
(
    [0] => ReflectionParameter Object
        (
            [name] => name
        )

    [1] => ReflectionParameter Object
        (
            [name] => email
        )

    [2] => ReflectionParameter Object
        (
            [name] => bannana
        )

)
于 2012-06-27T09:11:06.810 に答える