PHPのフレームワークです。オートローディング、ルーティング、ORマッパ、フォームバリデータ、その他ユーティリティがセットになっています。
リビジョン | 79 (tree) |
---|---|
日時 | 2021-01-14 11:58:27 |
作者 | ![]() |
ParamCheckFilterの仕様を変更
@@ -1,54 +1,60 @@ | ||
1 | 1 | <?php |
2 | 2 | |
3 | 3 | /** |
4 | - * GET変数やPOST変数に、アクションの仕様として必要なキーが揃っているかを調べるフィルタ。 | |
5 | - * システムが入力する値を手早くチェックするためのもの。ユーザが入力した値をチェックしてエラー理由まで説明しなければならない用途には向いていない。 | |
4 | + * GET変数やPOST変数に投入されたHTTP変数が仕様に沿ったものかを調べるフィルタ。 | |
5 | + * システム的に入力された値を手早くチェックするためのもので、ユーザが入力した値をチェックしてエラー理由まで説明しなければならない用途には向いていない。 | |
6 | 6 | * ルールの指定の仕方は NovaForm に準じる。入力値の補正も反映されるので注意。 |
7 | + * GET, POST の両方をチェックしなければならない場合はこのフィルタを複数セットするなどで対応できる。 | |
7 | 8 | * |
8 | 9 | * パラメータ) |
9 | - * get GET変数に必要なキーとルールを列挙した配列。 | |
10 | - * post 同じくPOST変数に対するもの。POSTメソッドでない場合は検査されない。 | |
10 | + * vars GET, POST のどちらを見るかを "get", "post" で指定する。省略時は GET。 | |
11 | + * rules 必要なキーとルールセットを列挙した配列。NovaForm コンストラクタの引数に準じる。 | |
12 | + * activate 起動条件。以下のいずれか。 | |
13 | + * always 常にチェックする。 | |
14 | + * auto デフォルト。vars="get" なら常に。vars="post" ならPOSTメソッドのときのみ。 | |
15 | + * get GETメソッドのときのみ。 | |
16 | + * post POSTメソッドのときのみ。 | |
11 | 17 | * |
12 | 18 | * 例) |
13 | - * GET変数に foo, bar が必要で、fooは真に評価される値でなければならず、barは空以外の値でなければならない("0"などはOK)。 | |
14 | - * また、POSTメソッドの場合、POST変数 baz が数字のみで構成された値でなければならない。 | |
19 | + * POST変数に foo, bar が必要で、fooは真に評価される値でなければならず、barは正の整数でなければならない。 | |
15 | 20 | * |
16 | 21 | * [ |
17 | - * 'get' => [ | |
22 | + * 'vars' => 'post', | |
23 | + * 'rules' => [ | |
18 | 24 | * 'foo' => 'nonzero', |
19 | - * 'bar' => 'required', | |
25 | + * 'bar' => ['required', 'type'=>'numonly'], | |
20 | 26 | * ], |
21 | - * 'post' => [ | |
22 | - * 'baz' => ['required', 'type'=>'numonly'], | |
23 | - * ], | |
24 | 27 | * ] |
25 | 28 | */ |
26 | 29 | class ParamCheckFilter extends NovaFilter { |
27 | 30 | |
28 | - protected static $defaults = array('get'=>[], 'post'=>[]); | |
31 | + protected static $defaults = array('vars'=>'get', 'activate'=>'auto', 'rules'=>[]); | |
29 | 32 | |
30 | 33 | //----------------------------------------------------------------------------------------------------- |
31 | 34 | protected function preExecute($action) { |
32 | 35 | |
33 | - // get, post の順で調べる。 | |
34 | - foreach(['get', 'post'] as $method) { | |
36 | + // パラメータ activate から、どのメソッドで処理するのかを変数 $filter へ取得。 | |
37 | + $filter = match($this->params['activate']) { | |
38 | + 'always' => array('GET', 'POST'), | |
39 | + 'auto' => ($this->params['vars'] == 'post') ? array('POST') : array('GET', 'POST'), | |
40 | + 'get' => array('GET'), | |
41 | + 'post' => array('POST'), | |
42 | + }; | |
35 | 43 | |
36 | - // POST変数を調べるのはPOSTメソッドのときのみ。 | |
37 | - if($method == 'post' && $_SERVER['REQUEST_METHOD'] != 'POST') | |
38 | - continue; | |
44 | + // そのメソッドでリクエストされていないならチェックしない。 | |
45 | + if( !in_array($_SERVER['REQUEST_METHOD'], $filter) ) | |
46 | + return; | |
39 | 47 | |
40 | - // 調査対象の変数を選択する。 | |
41 | - if($method == 'get') $args = &$_GET; | |
42 | - else $args = &$_POST; | |
48 | + // パラメータ vars に従って、処理する変数を $vars に取得。 | |
49 | + if($this->params['vars'] == 'post') $vars = &$_POST; | |
50 | + else $vars = &$_GET; | |
43 | 51 | |
44 | - // 指定されたパラメータ名を一つずつ見ていく。 | |
45 | - $needs = (array)$this->params[$method]; | |
46 | - foreach($needs as $key => $rules) { | |
52 | + // パラメータ rules に従って NovaForm で処理する。検証でエラーになったら例外スロー。 | |
53 | + $form = new NovaForm($this->params['rules']); | |
54 | + if( !$form->validate($vars) ) | |
55 | + throw new CrackingException(sprintf("%s変数の値がルールに適合しない。\nエラー:\n%s\n与えられた値:\n%s", $this->params['vars'], print_rmin($form->errors()), print_rmin($vars))); | |
47 | 56 | |
48 | - $error = NovaForm::execute($args[$key], $rules); | |
49 | - if($error) | |
50 | - throw new CrackingException(sprintf('%s変数 "%s" の値が %s ルールに抵触している。', $method, $key, $error)); | |
51 | - } | |
52 | - } | |
57 | + // 検証が通ったなら、ルールセットによる入力補正を適用して終了。 | |
58 | + $vars = $form['value']; | |
53 | 59 | } |
54 | 60 | } |
@@ -272,8 +272,8 @@ | ||
272 | 272 | $this->chain = array(); |
273 | 273 | foreach($definition as $key => $param) { |
274 | 274 | |
275 | - // フィルタ名の "." 以降を無視する形でクラス名を取得。 | |
276 | - [$class] = explode('.', $key); | |
275 | + // フィルタ名の "#" 以降を無視する形でクラス名を取得。 | |
276 | + [$class] = explode('#', $key); | |
277 | 277 | |
278 | 278 | // フィルタ作成。 |
279 | 279 | $this->chain[$key] = new $class($this, $param); |
@@ -94,8 +94,8 @@ | ||
94 | 94 | // パラメータのない FooFilter と、パラメータ array('a'=>5) で初期化した BarFilter を適用する。 |
95 | 95 | array('FooFilter', 'BarFilter'=>['a'=>5]); |
96 | 96 | |
97 | - // 同じクラスのフィルタを複数設定したい場合は次のようにする。"." のあとは何でも良い。 | |
98 | - array('BarFilter.1'=>['a'=>1], 'BarFilter.2'=>['a'=>1]); | |
97 | + // 同じクラスのフィルタを複数設定したい場合は次のようにする。"#" のあとは何でも良い。 | |
98 | + array('BarFilter#1'=>['a'=>1], 'BarFilter#2'=>['a'=>1]); | |
99 | 99 | |
100 | 100 | // 事前に設定されているフィルタにパラメータを追加するor書き換える。 |
101 | 101 | array('HogeFilter'=>['a'=>6]); |
@@ -2,6 +2,7 @@ | ||
2 | 2 | {[$title="APIテスト"]} |
3 | 3 | |
4 | 4 | {[block name="head"]} |
5 | + <script src="//ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> | |
5 | 6 | <script><!-- |
6 | 7 | |
7 | 8 | //----------------------------------------------------------------------------------------------------- |
@@ -4,13 +4,15 @@ | ||
4 | 4 | |
5 | 5 | protected $filters = array( |
6 | 6 | 'ApiBehaviorFilter' => ['filter_order'=>1], |
7 | -// 'ParamCheckFilter' => ['get'=>[ | |
8 | -// 'stamp' => ['truthy', 'type'=>'number', 'decimals'=>3], | |
9 | -// ]], | |
7 | + // 'ParamCheckFilter' => [ | |
8 | + // 'rules' => [ | |
9 | + // 'foo' => ['nonzero', 'type'=>'number', 'decimals'=>3] | |
10 | + // ], | |
11 | + // ], | |
10 | 12 | ); |
11 | 13 | |
12 | 14 | protected function execute() { |
13 | 15 | |
14 | - $this->renderer['error'] = 'hi'; | |
16 | + $this->renderer['hi'] = 'hi'; | |
15 | 17 | } |
16 | 18 | } |
@@ -1,27 +1,15 @@ | ||
1 | 1 | <?php |
2 | 2 | |
3 | -use BitcoinPHP\BitcoinECDSA\BitcoinECDSA; | |
4 | - | |
5 | 3 | class SandIndexAction extends AdminBaseAction { |
6 | 4 | |
7 | -// protected $filters = array( | |
8 | -// 'ParamCheckFilter' => ['get'=>[ | |
9 | -// 'stamp' => ['truthy', 'type'=>'number', 'decimals'=>3], | |
10 | -// ]], | |
11 | -// ); | |
5 | + protected $filters = []; | |
12 | 6 | |
13 | 7 | protected function execute() { |
14 | 8 | |
15 | - // $r = 'sand'; | |
9 | + $r = 'sand'; | |
16 | 10 | |
17 | - // var_dump($r); | |
18 | - // return 'none'; | |
19 | - | |
20 | - $this->renderer['validator'] = $v = new NovaValidator([ | |
21 | - 'item1' => ['callback'=> fn($v)=>var_export($v), '~regexp!'=>'[abc]*'], | |
22 | - ]); | |
23 | - | |
24 | - $v->validate(); | |
11 | + var_dump($r); | |
12 | + return 'none'; | |
25 | 13 | } |
26 | 14 | } |
27 | 15 |