1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218:
<?php
// このファイルの名前空間の定義
namespace SKJ\AppException;
/**
* バリデーションエラー実行例外の抽象クラス
*
* バリデーション処理がに失敗した場合に使用する例外です
*
* ◆詳細◆
* <ul>
* <li>このクラスは抽象クラスです</li>
* </ul>
*
* @package SKJ\AppException
* @version 0.8.0
* @author y3high <y3public@49364.net>
* @copyright 2019 Seikouhou.
* @license https://opensource.org/licenses/MIT MIT
* @since Class available since Release 0.8.0
*/
class AbstractValidationException extends RuntimeException
{
/**
* @api
* @var int エラーとして発生順の早いものから返す
* @uses self::SORT_ORDER_ASC 初期値として使用
*/
protected $iteratorSortOrder = self::SORT_ORDER_ASC;
/**
* 連結された例外も対象とし、例外コードを変更
*
* @api
* @param int $code 例外コード
* @return self 自分自身を返す
*/
public function setCodeToAll($code)
{
$this->setFilter(); // 現在の例外に限定!!
/**
* @var self $validError
*/
foreach ($this as $validError) {
$validError->setCode($code);
}
return $this;
}
/**
* 指定されたフィールド名に関する例外のみを抽出
*
* 第1引数仕様 - 抽出フィールド名
*
* <code>
* [
* (string)抽出対象のフィールド => (string|null)変更したいフィールド名,...
* ※フィールド名の変更の必要が無ければnull
* ]
* </code>
*
* @api
* @param array $fields 抽出フィールド名
* @param bool $multiField 複数フィールド間に渡ったエラーも対象とするか
* @return static|null 抽出された例外、抽出結果がない場合はnull
*/
public function extractBy(array $fields = [], $multiField = true)
{
$exception = null;
$this->setFilter(); // 現在の例外に限定!!
/**
* @var self $validationError
*/
foreach ($this as $validationError) {
$errorFields = $validationError->getFields();
$renameFields = [];
// 本来のdebug_backtrace()の戻り値とは違ってobjectエントリがないので注意
$callQueue = $validationError->getCallQueue();
// 複数フィールド間に渡ったエラーで<var>$multiple</var>が偽なら無視
if (count($errorFields) > 1 and $multiField == false) {
continue;
}
// フィールド名情報も変換しておく
foreach ($errorFields as $field) {
if (array_key_exists($field, $fields) and
!is_null($fields[$field])) {
$renameFields[] = $fields[$field];
} else {
$renameFields[] = $field;
}
}
foreach ($fields as $field => $newFieldName) {
if (array_search($field, $errorFields) !== false) {
// Late Static Bindingsを使用しているので注意
$exception = (new static(
$validationError->getMessage(),
$validationError->getCode(),
$exception
))->setFields(
$renameFields
)->setStatusCode($validationError->getStatusCode())->forge(
$callQueue
);
continue 2;
}
}
}
/**
* @var self|null $exception
*/
return $exception;
}
/**
* 指定されたフィールドにエラーが発生したかを調べる
*
* @api
* @param string|array $fields 調べたいフィールド名、配列で複数指定も可
* @param bool $multiField 複数フィールド間に渡ったエラーも対象とするか
* @return bool フィールドにエラーがあれば真、無ければ偽
*/
public function hasErrorOn($fields, $multiField = true)
{
if (!is_array($fields)) {
$fields = [$fields];
}
$this->setFilter(); // 現在の例外に限定!!
/**
* @var self $validError
*/
foreach ($this as $validError) {
$errorFields = $validError->getFields();
// 複数フィールド間に渡ったエラーで<var>$multiple</var>が偽なら無視
if (count($errorFields) > 1 and $multiField == false) {
continue;
}
foreach ($fields as $field) {
if (array_search($field, $errorFields) !== false) {
return true;
}
}
}
return false;
}
/**
* 発生したエラーメッセージを配列にまとめて返す
*
* 同一フィールドに複数メッセージが設定されている場合は最初に発生したものが返される
*
* 戻り値仕様 - エラーメッセージ配列
*
* <code>
* [
* (string)フィールド名 => (string)エラーメッセージ,...
* ]
* </code>
*
* @api
* @param array $renameFields 変更したいフィールド名が入った配列(※フィールド名が違う可能性もある)
* @return array エラーメッセージ配列
*/
public function getMessageArray(array $renameFields = [])
{
$result = [];
$this->setFilter(); // 現在の例外に限定!!
foreach ($this as $validError) {
/**
* @var self $validError
*/
// 同一フィールドで複数メッセージを返したいのなら新たなメソッドをつくるべき
foreach ($validError->getFields() as $field) {
if (array_key_exists($field, $renameFields)) {
$field = $renameFields[$field];
}
if (!array_key_exists($field, $result)) {
$result[$field] = $validError->getMessage();
}
}
}
return $result;
}
}