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