• R/O
  • SSH
  • HTTPS

コミット

タグ
未設定

よく使われているワード(クリックで追加)

javaandroidc++linuxc#objective-ccocoa誰得qtrubypythonwindowsphpgamebathyscaphegui翻訳comegattwitterframeworkbtronvb.net計画中(planning stage)testdomarduinodirectxpreviewerゲームエンジン

PHPのフレームワークです。オートローディング、ルーティング、ORマッパ、フォームバリデータ、その他ユーティリティがセットになっています。


コミットメタ情報

リビジョン79 (tree)
日時2021-01-14 11:58:27
作者tantancode

ログメッセージ

ParamCheckFilterの仕様を変更

変更サマリ

差分

--- lib/extension/filters/ParamCheckFilter.php (revision 78)
+++ lib/extension/filters/ParamCheckFilter.php (revision 79)
@@ -1,54 +1,60 @@
11 <?php
22
33 /**
4- * GET変数やPOST変数に、アクションの仕様として必要なキーが揃っているかを調べるフィルタ。
5- * システムが入力する値を手早くチェックするためのもの。ユーザが入力した値をチェックしてエラー理由まで説明しなければならない用途には向いていない。
4+ * GET変数やPOST変数に投入されたHTTP変数が仕様に沿ったものかを調べるフィルタ。
5+ * システム的に入力された値を手早くチェックするためのもので、ユーザが入力した値をチェックしてエラー理由まで説明しなければならない用途には向いていない。
66 * ルールの指定の仕方は NovaForm に準じる。入力値の補正も反映されるので注意。
7+ * GET, POST の両方をチェックしなければならない場合はこのフィルタを複数セットするなどで対応できる。
78 *
89 * パラメータ)
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メソッドのときのみ。
1117 *
1218 * 例)
13- * GET変数に foo, bar が必要で、fooは真に評価される値でなければならず、barは空以外の値でなければならない("0"などはOK)。
14- * また、POSTメソッドの場合、POST変数 baz が数字のみで構成された値でなければならない。
19+ * POST変数に foo, bar が必要で、fooは真に評価される値でなければならず、barは正の整数でなければならない。
1520 *
1621 * [
17- * 'get' => [
22+ * 'vars' => 'post',
23+ * 'rules' => [
1824 * 'foo' => 'nonzero',
19- * 'bar' => 'required',
25+ * 'bar' => ['required', 'type'=>'numonly'],
2026 * ],
21- * 'post' => [
22- * 'baz' => ['required', 'type'=>'numonly'],
23- * ],
2427 * ]
2528 */
2629 class ParamCheckFilter extends NovaFilter {
2730
28- protected static $defaults = array('get'=>[], 'post'=>[]);
31+ protected static $defaults = array('vars'=>'get', 'activate'=>'auto', 'rules'=>[]);
2932
3033 //-----------------------------------------------------------------------------------------------------
3134 protected function preExecute($action) {
3235
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+ };
3543
36- // POST変数を調べるのはPOSTメソッドのときのみ。
37- if($method == 'post' && $_SERVER['REQUEST_METHOD'] != 'POST')
38- continue;
44+ // そのメソッドでリクエストされていないならチェックしない。
45+ if( !in_array($_SERVER['REQUEST_METHOD'], $filter) )
46+ return;
3947
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;
4351
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)));
4756
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'];
5359 }
5460 }
--- nova/NovaAction.php (revision 78)
+++ nova/NovaAction.php (revision 79)
@@ -272,8 +272,8 @@
272272 $this->chain = array();
273273 foreach($definition as $key => $param) {
274274
275- // フィルタ名の "." 以降を無視する形でクラス名を取得。
276- [$class] = explode('.', $key);
275+ // フィルタ名の "#" 以降を無視する形でクラス名を取得。
276+ [$class] = explode('#', $key);
277277
278278 // フィルタ作成。
279279 $this->chain[$key] = new $class($this, $param);
--- nova/readme.txt (revision 78)
+++ nova/readme.txt (revision 79)
@@ -94,8 +94,8 @@
9494 // パラメータのない FooFilter と、パラメータ array('a'=>5) で初期化した BarFilter を適用する。
9595 array('FooFilter', 'BarFilter'=>['a'=>5]);
9696
97- // 同じクラスのフィルタを複数設定したい場合は次のようにする。"." のあとは何でも良い。
98- array('BarFilter.1'=>['a'=>1], 'BarFilter.2'=>['a'=>1]);
97+ // 同じクラスのフィルタを複数設定したい場合は次のようにする。"#" のあとは何でも良い。
98+ array('BarFilter#1'=>['a'=>1], 'BarFilter#2'=>['a'=>1]);
9999
100100 // 事前に設定されているフィルタにパラメータを追加するor書き換える。
101101 array('HogeFilter'=>['a'=>6]);
--- sites/admin/develop/ApiView.html (revision 78)
+++ sites/admin/develop/ApiView.html (revision 79)
@@ -2,6 +2,7 @@
22 {[$title="APIテスト"]}
33
44 {[block name="head"]}
5+ <script src="//ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
56 <script><!--
67
78 //-----------------------------------------------------------------------------------------------------
--- sites/admin/sand/ApiAction.php (revision 78)
+++ sites/admin/sand/ApiAction.php (revision 79)
@@ -4,13 +4,15 @@
44
55 protected $filters = array(
66 '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+ // ],
1012 );
1113
1214 protected function execute() {
1315
14- $this->renderer['error'] = 'hi';
16+ $this->renderer['hi'] = 'hi';
1517 }
1618 }
--- sites/admin/sand/IndexAction.php (revision 78)
+++ sites/admin/sand/IndexAction.php (revision 79)
@@ -1,27 +1,15 @@
11 <?php
22
3-use BitcoinPHP\BitcoinECDSA\BitcoinECDSA;
4-
53 class SandIndexAction extends AdminBaseAction {
64
7-// protected $filters = array(
8-// 'ParamCheckFilter' => ['get'=>[
9-// 'stamp' => ['truthy', 'type'=>'number', 'decimals'=>3],
10-// ]],
11-// );
5+ protected $filters = [];
126
137 protected function execute() {
148
15- // $r = 'sand';
9+ $r = 'sand';
1610
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';
2513 }
2614 }
2715