AMatch、パート2。エラーコード、独自のエラー、新しいコールバック形式

この記事では、 最初の記事を書いてからAMatchプロジェクトに現れたいくつかの革新について話します



AMatchは、多数のifからの入力パラメーターの検証が便利で簡潔なレコードに変わることを支援するクラスであることを思い出させてください。 例:



例:シンプル

$match = AMatch::runMatch($params) ->doc_id(0, '<') //    ->subject_id(0, '!=') //    ; $result = $match->stopMatch(); if (!$result) { die(var_export($match->matchComments(), true)); //    }
      
      







入力データ



さらなる例では、「良い」バージョンと「悪い」バージョンの配列をチェックします。



例:入力データ

 $params = array( 'subject_id' => '64', 'parent_id' => -32, 'delimeter' => '-4.645E+32', 'title' => 'New document', 'links' => array(13, '-16', 24), 'email' => 'someuser@mail.dom', ); $params_bad = array( 'subject_id' => '64.43', 'parent_id' => array(), 'delimeter' => '-4.x6E.32', 'title' => new stdClass(), 'links' => array(0, array(0, array(0)), 0), 'email' => 'someuser!@mail.dom', );
      
      







テスト結果を確認するには、次の関数を作成します。



例:結果関数

 function result(AMatch $match) { echo PHP_EOL; echo $match->stopMatch() ? 'Dance!' : 'Cry!' ; echo PHP_EOL; var_export($match->matchResults()); echo PHP_EOL; var_export($match->matchComments()); echo PHP_EOL; var_export($match->matchCommentsConditions()); }
      
      







エラー処理



最初のバージョンでは、エラーは文字列定数によって与えられていました。 これで独自のマッピングを作成できますが、butいものでした。 現時点では、エラーは別のクラスAMatchStatusで行われます。 これにより、次の素晴らしいことができました。



エラーコードを取得する


単純な検証条件を作成し、そこに良い配列と悪い配列を連続して送信します。



例:悪い警官と良い警官

 $match = AMatch::runMatch($params, AMatch::FLAG_SHOW_GOOD_COMMENTS)->delimeter('', 'float'); //     result($match); $match = AMatch::runMatch($params_bad, AMatch::FLAG_SHOW_GOOD_COMMENTS)->delimeter('', 'float'); result($match);
      
      





その結果、次の答えが得られます
 //   Dance! array ( 'delimeter' => 103, ) array ( 'delimeter' => 'OK. Expected parameter type is valid', ) array ( 'delimeter' => array ( 0 => '', 1 => 'float', ), ) //   Cry! array ( 'delimeter' => 3, ) array ( 'delimeter' => 'Expected parameter type is not valid', ) array ( 'delimeter' => array ( 0 => 'float', 1 => 'float', ), )
      
      







例からわかるように:

-matchResults()はエラーコードを返します。

-matchComments()-コメント、

-matchCommentsConditions()-検証条件と追加情報。



AMatchのフロートに関する追加情報
is_floatを介してfloatはチェックされないことに注意してください

//有効なfloat値:

1、-1、1.0、-1.0、「1」、「-1」、「1.0」、「-1.0」、「2.1」、「0」、0、「0」、「0.1」、「-0.0」 、-0.0、3、「-3。」、「。27」、0.27、「-0」、「+ 4」、「1e2」、「+ 1353.0316547」、「13213.032468e-13465」、「-8E」 +3 '、' -1354.98879e + 37436 '



//無効な値:

false、true、 ''、 '-'、 '。a'、 '-1.a'、 '。a'、 '。'、 '-。'、 '1 +'、 '1.3 +'、 'a1' 、「e.e」、「-e-4」、「e2」、「8e」、「3.25」、「1.1.1」





エラーマッピング


既存のコード内で受け入れられている標準に従ってエラーを「出力」する関数を作成してみましょう。



例:マッピング

 function mapping(AMatch $match) { //   $errors_mapping = array( AMatchStatus::KEY_TYPE_NOT_VALID => 'invalid_type', AMatchStatus::KEY_CONDITION_NOT_VALID => 'invalid_data', AMatchStatus::KEY_NOT_EXISTS => 'required', ); $results = $match->matchResults(); //    $comments = $match->matchComments(); //    $comments_conditions = $match->matchCommentsConditions(); //   $output = array(); foreach ($results as $param => $result) { $error = array_key_exists($result, $errors_mapping) ? $errors_mapping[$result] : 'other_errors'; // ,      $comment = $param . ': ' . $comments[$param]; if (isset($comments_conditions[$param]) && !empty($comments_conditions[$param][0])) { $comment .= ' (' . $comments_conditions[$param][0] . ')'; //   } $output[$error][] = $comment; } var_export($output); } $match = AMatch::runMatch($params_bad, AMatch::FLAG_SHOW_GOOD_COMMENTS | AMatch::FLAG_DONT_STOP_MATCHING) ->title('', 'string') //    string ->parent_id('', 'int') //    string ->ineedkey() //    ->subject_id(1, '>') // "1"    ->delimeter('', 'blabla') //    ; mapping($match);
      
      







このコードの実行の結果、以前に記述されたコードになじみのあるエラー構造を持つ配列が取得されます。



「マッピング」の例の結果
 array ( 'invalid_type' => array ( 0 => 'title: Expected parameter type is not valid (string)', 1 => 'parent_id: Expected parameter type is not valid (int)', ), 'required' => array ( 0 => 'ineedkey: Expected parameter does not exist in the array of parameters', ), 'invalid_data' => array ( 0 => 'subject_id: Condition is not valid (1)', ), 'other_errors' => array ( 0 => 'delimeter: Condition is unknown', ), )
      
      









あらゆる条件の独自のエラーデコード


任意の条件のコメントに独自のエラーを取得するには(この条件が失敗した場合)、3番目のパラメーターでテキストを渡すだけで十分です。 上記の例のエラーにテキストを追加します(「マッピング」):



例:固有のエラー

 ... ->title('', 'string', 'Incorrect document title. Please, read FAQ.') ...
      
      







そしてもう一度実行する
 array ( 'other_errors' => array ( 0 => 'title: Incorrect document title. Please, read FAQ. (string)', 1 => 'delimeter: Condition is unknown', ),
      
      







ただし、各条件を置き換える必要は必ずしもありません。 すべてのコメントを置き換える必要がある場合があります。



エラーのあるクラスの置換(i18nを含む)


「マッピング」の例に戻りましょう。 必要なすべてのエラーを完全に置き換えるために、AMatchStatusから継承クラスを作成します。 内部では、_fillComments()メソッドをオーバーロードし、親を呼び出すことを忘れないでください。 このクラスのオブジェクトを作成し、AMatch :: runMatch();に渡す必要があります。 3番目のパラメーター。



例:ロシア語

 class AMatchRussian extends AMatchStatus { protected function _fillComments() { parent::_fillComments(); //     ,         $this->_result_comments[self::KEY_NOT_EXISTS] = ',  .  '; $this->_result_comments[self::KEY_CONDITION_NOT_VALID] = '   ,   '; $this->_result_comments[self::CONDITION_IS_UNKNOWN] = ''; } } $match = AMatch::runMatch($params_bad, AMatch::FLAG_SHOW_GOOD_COMMENTS | AMatch::FLAG_DONT_STOP_MATCHING, new AMatchRussian()) // ...   ,     mapping ; mapping($match);
      
      







答えには、翻訳されていない構造とともに翻訳された構造が含まれます。

例「ロシア語」の結果
 array ( 'other_errors' => array ( 0 => 'title: Incorrect document title. Please, read FAQ. (string)', 1 => 'delimeter: ', ), 'invalid_type' => array ( 0 => 'parent_id: Expected parameter type is not valid (int)', ), 'required' => array ( 0 => 'ineedkey: ,  .  ', ), 'invalid_data' => array ( 0 => 'subject_id:    (1)', ), )
      
      









新しいコールバック機能



エラーの追跡に加えて、ユーザー関数の操作が少し改善されました。 以前、次のように呼び出すことができることを思い出させてください。



 $match->data(array($this, 'callbackMethod'), 'callback');
      
      





現在、コールバックのサポートが拡張されており、次のように呼び出すことができます。



例:コールバック

 // param([mixed $callback_argument], [callable|callable $callback]) //  // param([callable|string $callback], 'callback') // : ->param($callback_property, 'MyClass::myFunc') ->param($callback_property, 'MyClass->myFunc') ->param($callback_property, array($my_obj, 'myFunc')) ->param($callback_property, array('MyClass', 'myFunc'))
      
      







組み込みのコールバックプラグイン



AMatchライブラリとともに、カスタム呼び出しとして使用できるメソッドを備えた既製のクラスの例があります。 これらは2つのクラスです。

  1. クラスAMatchArray
  2. クラスAMatchString


使用例を検討してください。



例:プラグイン

 function matchCallbacks($params) { $match = AMatch::runMatch($params, AMatch::FLAG_DONT_STOP_MATCHING) ->parent_id('/^-?\d+$/', 'AMatchString::pregMatch') //     ->title(12, 'AMatchString::length') //    ->email('([\w-]+@([\w-]+\.)+[\w-]+)', 'AMatchString::isEmail') //  email   (  ) ->links(AMatchArray::FLAG_EMPTY_SOME_ELEMENT, 'AMatchArray::isNotEmpty') //     :            - ; result($match); } matchCallbacks($params); matchCallbacks($params_bad);
      
      







プラグインの例の結果
 //   Dance! array ( ) array ( ) array ( ) //   Cry! array ( 'parent_id' => 'str3', 'title' => 'str5', 'email' => 'str4', 'links' => 'arr8', ) array ( 'parent_id' => 'The string does not match the regular expression', 'title' => 'String required', 'email' => 'Incorrect email', 'links' => 'At least one element of the array must be non-empty', ) array ( 'parent_id' => array ( 0 => '/^-?\\d+$/', 1 => 'AMatchString::pregMatch', ), 'title' => array ( 0 => 12, 1 => 'AMatchString::length', ), 'email' => array ( 0 => 'someuser!@mail.dom', 1 => 'AMatchString::isEmail', ), 'links' => array ( 0 => NULL, 1 => 'AMatchArray::isNotEmpty', ), )
      
      









手紙後



現時点でAMatchを呼び出すための一般的なスキームは次のとおりです。



 $match = AMatch::runMatch(array $associative_array, bitmask $flags, AMatchStatus $obj) ->_([___], []) ->…; $match->stopMatch(); //    $match->matchResults(); //    (   ,  ) $match->matchComments(); //   $match->matchCommentsConditions(); //   
      
      





他の例( unittestsを参照)を見つけて、この記事の例(examples2.php) を含む既製のファイルを見つけるgithubにAMatchソースダウンロードできます。



UPD:

Composerに変換されます。



All Articles