ユーザー入力値を検証したい。
現在作ったものがこちら
php
1namespace app\model\data; 2use app\model\enum; 3class paramType extends enum{ 4 const STRING = 0; 5 const NUMERIC = 1; 6 const BOOL = 2; 7}
php
1namespace app\model\data; 2use app\model\data\paramType; 3 4/** 5 * 入力値検証 6 * Class paramModel 7 * @package app\model\data\paramModel 8 */ 9class paramModel { 10 11 const STRING = 0; 12 const NUMERIC = 1; 13 const BOOL = 2; 14 private static $instance; 15 16 private function __construct() { 17 } 18 19 public static function getInstance() { 20 if (!isset(self::$instance)) { 21 self::$instance = new paramModel(); 22 } 23 return self::$instance; 24 } 25 26 public function get(string $key, paramType $mode) { 27 if(!isset($_GET[$key])) { 28 self::_exception('Param ' . $key . 'not defined'); 29 } 30 switch($mode) { 31 case paramType::BOOL: 32 return $this->_bool($_GET[$key]); 33 case paramType::NUMERIC: 34 return $this->_numeric($_GET[$key]); 35 case paramType::STRING: 36 return $this->_string($key); 37 } 38 } 39 40 /** 41 * @param string $key 42 * @param \app\model\data\paramType $mode 43 * @return int|mixed|null 44 * @throws \Exception 45 */ 46 public function post(string $key, paramType $mode) { 47 if(!isset($_POST[$key])) { 48 self::_exception('Param ' . $key . 'not defined'); 49 } 50 switch($mode) { 51 case paramType::BOOL: 52 return $this->_bool($_POST[$key]); 53 case paramType::NUMERIC: 54 return $this->_numeric($_POST[$key]); 55 case paramType::STRING: 56 return $this->_string(POST_[$key]); 57 } 58 } 59 60 private function _bool($val){ 61 if(is_bool($val)) { 62 return $val; 63 } 64 self::_exception('not bool ' . $val); 65 } 66 67 private function _numeric($var) { 68 if(is_numeric($var)) { 69 return (int)$var; 70 } 71 self::_exception('not numeric ' . $var); 72 } 73 74 /** 75 * バイナリの削除 76 * @param $var 77 * @return mixed 78 * @throws \Exception 79 */ 80 private function _string($var) { 81 if(is_array($var)) { 82 foreach($var as $str) { 83 self::_string($str); 84 } 85 } elseif (is_string($var)) { 86 return preg_replace('/[\x00-\x1F\x7F]/ug', '', strtrim($var)); 87 } 88 $this->_exception('param is not correct'); 89 } 90 91 private function _exception($msg){ 92 throw new \Exception($msg); 93 } 94} 95var_dump(paramModel::getInstance()->post('token', paramType::STRING));
こちらのenum クラスを参考にして受け取る $mode をnumber, string, bool に制御したいと思うのですが上手くいきません。enum クラスは記事のものをそのまま使わせていただいています。
https://qiita.com/Hiraku/items/71e385b56dcaa37629fe
エラー
Fatal error: Uncaught TypeError: Argument 2 passed to app\model\data\paramModel::post() must be an instance of app\model\data\paramType, int given,
エラーを見る限り2つ目のパラメータで渡してる paraType::STRING がint なのが問題なのでメソッドのget, post を変えなければいけないと思うのですがどうやって目標の あらかじめ定義した値のいずれかしか取らない パラメータを設定できますか?
また$_REQUEST系統のパラメータの取得はこの方式で問題無いでしょうか。
この様に
php
1 paramModel::getIntance()->post('[キー]', [paramType::型])
で上手くいけば取得したいと思っています。
よろしくお願いします。
最終的にどうなったか
php
1/** 2 public static function get(string $key, paramType $mode) { 3 if(!isset($_GET[$key])) { 4 self::_exception('Param ' . $key . 'not defined'); 5 } 6 switch($mode->valueOf()) { 7 case paramType::BOOL: 8 return self::_bool($_GET[$key]); 9 case paramType::NUMERIC: 10 return self::_numeric($_GET[$key]); 11 case paramType::STRING: 12 return self::_string($key); 13 } 14 } 15 16 public static function post(string $key, paramType $mode) { 17 if(!isset($_POST[$key])) { 18 self::_exception('Param ' . $key . ' not defined'); 19 } 20 switch($mode->valueOf()) { 21 case paramType::BOOL: 22 return self::_bool($_POST[$key]); 23 case paramType::NUMERIC: 24 return self::_numeric($_POST[$key]); 25 case paramType::STRING: 26 return self::_string(POST_[$key]); 27 } 28 }
paramTypeは特に変える必要性が無く呼び方を修正すれば大丈夫と教えていただいたので paramType::String() でparamTypeのインスタンス作成
paramModelは直接質問と関係ないけど修正したので一応上げました。
paramTypeのセットされた変数は valueOf() で呼ぶ必要があるみたいです。
php
1$_GET['someVar'] = true; 2var_dump(paramModel::get('someVar',paramType::BOOL()));
こんな感じで使えるようになりました。ありがとうございました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/08/10 23:05 編集
退会済みユーザー
2019/08/10 23:09
退会済みユーザー
2019/08/10 23:12
退会済みユーザー
2019/08/10 23:13
退会済みユーザー
2019/08/10 23:19
退会済みユーザー
2019/08/10 23:19
退会済みユーザー
2019/08/10 23:24
退会済みユーザー
2019/08/10 23:39
退会済みユーザー
2019/08/10 23:42
退会済みユーザー
2019/08/10 23:49
退会済みユーザー
2019/08/11 00:04
退会済みユーザー
2019/08/11 00:09
退会済みユーザー
2019/08/11 00:12
退会済みユーザー
2019/08/11 00:14
退会済みユーザー
2019/08/11 00:22 編集
退会済みユーザー
2019/08/11 00:32
2019/08/11 08:44
退会済みユーザー
2019/08/11 08:47
退会済みユーザー
2019/08/11 08:50
2019/08/11 08:53
退会済みユーザー
2019/08/11 08:57
退会済みユーザー
2019/08/11 08:59
2019/08/11 09:04