Overview

Namespaces

  • SKJ
    • AppException
      • HTTP
      • Logic
      • Runtime

Classes

  • SKJ\Label

Interfaces

  • SKJ\AppExceptionInterface

Traits

  • SKJ\AppExceptionMethods

Exceptions

  • SKJ\AppException
  • SKJ\AppException\AbstractContainerException
  • SKJ\AppException\AbstractDateTimeException
  • SKJ\AppException\AbstractHttpException
  • SKJ\AppException\AbstractValidationException
  • SKJ\AppException\HTTP\BadGatewayException
  • SKJ\AppException\HTTP\BadRequestException
  • SKJ\AppException\HTTP\ConflictException
  • SKJ\AppException\HTTP\ExpectationFailedException
  • SKJ\AppException\HTTP\FailedDependencyException
  • SKJ\AppException\HTTP\ForbiddenException
  • SKJ\AppException\HTTP\GatewayTimeoutException
  • SKJ\AppException\HTTP\GoneException
  • SKJ\AppException\HTTP\HttpVersionNotSupportedException
  • SKJ\AppException\HTTP\InternalServerErrorException
  • SKJ\AppException\HTTP\LengthRequiredException
  • SKJ\AppException\HTTP\LockedException
  • SKJ\AppException\HTTP\MethodNotAllowedException
  • SKJ\AppException\HTTP\NotAcceptableException
  • SKJ\AppException\HTTP\NotFoundException
  • SKJ\AppException\HTTP\NotImplementedException
  • SKJ\AppException\HTTP\PaymentRequiredException
  • SKJ\AppException\HTTP\PreconditionFailedException
  • SKJ\AppException\HTTP\ProxyAuthenticationRequiredException
  • SKJ\AppException\HTTP\RequestedRangeNotSatisfiableException
  • SKJ\AppException\HTTP\RequestEntityTooLargeException
  • SKJ\AppException\HTTP\RequestTimeoutException
  • SKJ\AppException\HTTP\RequestUriTooLongException
  • SKJ\AppException\HTTP\ServiceUnavailableException
  • SKJ\AppException\HTTP\UnauthorizedException
  • SKJ\AppException\HTTP\UnprocessableEntityException
  • SKJ\AppException\HTTP\UnsupportedMediaTypeException
  • SKJ\AppException\HttpException
  • SKJ\AppException\Logic\BadFunctionCallException
  • SKJ\AppException\Logic\BadMethodCallException
  • SKJ\AppException\Logic\CircularReferenceException
  • SKJ\AppException\Logic\ContainerException
  • SKJ\AppException\Logic\DependencyInjectionException
  • SKJ\AppException\Logic\DomainException
  • SKJ\AppException\Logic\EnvironmentException
  • SKJ\AppException\Logic\InvalidArgumentException
  • SKJ\AppException\Logic\LengthException
  • SKJ\AppException\Logic\OutOfRangeException
  • SKJ\AppException\Logic\UnexpectedValueException
  • SKJ\AppException\LogicException
  • SKJ\AppException\Runtime\AuthenticationException
  • SKJ\AppException\Runtime\DeadLockException
  • SKJ\AppException\Runtime\DuplicationException
  • SKJ\AppException\Runtime\DurationException
  • SKJ\AppException\Runtime\EmptyResultException
  • SKJ\AppException\Runtime\ExpiryException
  • SKJ\AppException\Runtime\InvalidElementException
  • SKJ\AppException\Runtime\MissingElementException
  • SKJ\AppException\Runtime\NoConditionException
  • SKJ\AppException\Runtime\OutOfBoundsException
  • SKJ\AppException\Runtime\OverflowException
  • SKJ\AppException\Runtime\PermissionException
  • SKJ\AppException\Runtime\RangeException
  • SKJ\AppException\Runtime\TemporaryFailureException
  • SKJ\AppException\Runtime\TimeoutException
  • SKJ\AppException\Runtime\TransactionException
  • SKJ\AppException\Runtime\UnavailableServiceException
  • SKJ\AppException\Runtime\UnderflowException
  • SKJ\AppException\Runtime\UnexpectedValueException
  • SKJ\AppException\Runtime\UploadException
  • SKJ\AppException\Runtime\ValidationException
  • SKJ\AppException\Runtime\WrongArgumentException
  • SKJ\AppException\RuntimeException
  • Overview
  • Namespace
  • Class
  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;
    }
}
API documentation generated by ApiGen