Symfony2で覗いた関数の引数に、URLに直接渡される必要なパラメーターを書くというアイデア。 ルートを識別するためにPHPdocコメントが使用されました。
たとえば、次のようなコントローラーを確認します。
class Controller { /** * * @a /^[0-9]+$/i * @b /^[0-9a-z]+$/i */ function testAction ( $a, $b = 'something' ) { echo 'a: '.$a.', b: '.$b; } }
警告にもかかわらず、1 in 1の例を使用する場合は、注意してください。
-Reflection APIが遅い
-難読化の不可能性
-アーキテクチャの非自明性とイデオロギーの歪み
-チームまたはサードパーティの開発者によるサポート/開発で起こりうる問題。
したがって、タスク:変数「a」が渡されない場合、または「余分な」変数が渡される場合、エラーが生成されます。変数「b」が指定されない場合、デフォルト値が置き換えられます。 両方の変数は、PHPDocで規定されている正規表現に対してチェックされます。
その結果、検証機能は次のようになりました。
function CheckURLValid ( $class, $method, $values_arr = array() ) { $class = new ReflectionClass( $class ); $method = $class->getMethod( $method ); $param = $method->getParameters(); $doc = $method->getDocComment(); // PHPdoc preg_match_all( '/@([a-z0-9_-]+)([^\n]+)/is', $doc, $arr ); $reg_arr = array_combine($arr[1], $arr[2]); // $params_arr = array(); foreach ( $param as $p ) { $key = $p->getName(); $value = isset ( $values_arr[$key] ) ? $values_arr[$key] : false; $regular = isset ( $reg_arr[$key] ) ? trim($reg_arr[$key]) : false; $default = $p->isDefaultValueAvailable() ? $p->getDefaultValue() : NULL; // - if ( isset ( $values_arr[$key] ) ) { if ( $regular && !preg_match( $regular, $values_arr[$key] ) ) throw new Exception( ' "'.$key.'" !' ); // } elseif ( !$p->isOptional() ) throw new Exception( ' !' ); // $params_arr[$key] = $value ? $value : $default; } // if ( count(array_diff_key( $values_arr, $params_arr )) ) throw new Exception ( ' !' ); return $params_arr; }
使用例:
try { $arr = CheckURLValid( 'Controller', 'testAction', $_GET ); call_user_func_array( array('Controller', 'testAction'), $arr ); } catch ( Exception $e ) { echo $e->getMessage(); }
タイプのさまざまなバリエーションを駆動できます。
/test.php
/test.php?a=abc
/test.php?a=12
/test.php?a=12&b=another
/test.php?a=12&c=13
1つのファイルを選択できます 。