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: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 
<?php
// このファイルの名前空間の定義
namespace SKJ\AppException;

/**
 * HTTP層実行例外の抽象クラス
 *
 * HTTP層で必要となる、HTTPレスポンスを生成する基となる情報を保持する例外です
 *
 * ◆詳細◆
 * <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
 */
abstract class AbstractHttpException extends RuntimeException
{
    /**
     * レスポンスボディの形式を表す定数
     *
     * @api
     */
    const RES_BODY_FORMAT_TEXT = 1, RES_BODY_FORMAT_HTML = 2, RES_BODY_FORMAT_JSON = 3;
    /**
     * @internal
     * @var int|null レスポンスボディの形式を表す
     */
    protected $responseBodyFormat = null;
    /**
     * @internal
     * @var array HTTPレスポンスヘッダ配列
     */
    protected $headers = ['Content-Type' => 'text/plain charset=UTF-8'];
    /**
     * @internal
     * @var array HTTPクッキー配列
     */
    protected $cookies = [];
    /**
     * @internal
     * @var string|null HTTPレスポンスボディ
     */
    protected $body = null;

    /**
     * HTTPレスポンスヘッダを取得する
     *
     * @api
     * @param string $name HTTPレスポンスヘッダ名称
     * @return string HTTPレスポンスヘッダ値
     */
    public function getHeader($name)
    {
        return $this->headers[$name];
    }

    /**
     * 全てのHTTPレスポンスヘッダを取得する
     *
     * 戻り値仕様 - HTTPレスポンスヘッダ配列
     *
     * <code>
     * [
     *     (string)HTTPレスポンスヘッダ名 => (string)HTTPレスポンスヘッダ値,...
     * ]
     * </code>
     *
     * @api
     * @return array HTTPレスポンスヘッダ配列
     */
    public function getHeaders()
    {
        return $this->headers;
    }

    /**
     * 名前と値を受け取り、HTTPレスポンスヘッダを設定する
     *
     * @api
     * @param string $name HTTPレスポンスヘッダ名称
     * @param string $value HTTPレスポンスヘッダ値
     * @return self 自分自身を返す
     */
    public function setHeader($name, $value)
    {
        $this->headers[$name] = $value;

        return $this;
    }

    /**
     * 連想配列を受け取り、HTTPレスポンスヘッダを設定する
     *
     * @api
     * @param array $headers HTTPレスポンスヘッダを表す連想配列
     * @param bool $append 追記モード
     * @return self 自分自身を返す
     */
    public function setHeaders(array $headers, $append = false)
    {
        if ($append) {

            $this->headers = $headers + $this->headers;

        } else {

            $this->headers = $headers;
        }

        return $this;
    }

    /**
     * HTTPクッキーを取得する
     *
     * @api
     * @param string $name HTTPクッキー名称
     * @return string HTTPクッキー値
     */
    public function getCookie($name)
    {
        return $this->cookies[$name];
    }

    /**
     * 全てのHTTPクッキーを取得する
     *
     * 戻り値仕様 - HTTPクッキー配列
     *
     * <code>
     * [
     *     (string)HTTPクッキー名 => (string)HTTPクッキー値,...
     * ]
     * </code>
     *
     * @api
     * @return array HTTPクッキー配列
     */
    public function getCookies()
    {
        return $this->cookies;
    }

    /**
     * 名前と値を受け取り、HTTPクッキーを設定する
     *
     * @api
     * @param string $name HTTPクッキー名称
     * @param string $value HTTPクッキー値
     * @return self 自分自身を返す
     */
    public function setCookie($name, $value)
    {
        $this->cookies[$name] = $value;

        return $this;
    }

    /**
     * 連想配列を受け取り、HTTPクッキーを設定する
     *
     * @api
     * @param array $cookies HTTPクッキーを表す連想配列
     * @param bool $append 追記モード
     * @return self 自分自身を返す
     */
    public function setCookies(array $cookies, $append = false)
    {
        if ($append) {

            $this->cookies = $cookies + $this->cookies;

        } else {

            $this->cookies = $cookies;
        }

        return $this;
    }

    /**
     * HTTPレスポンスボディの形式を設定する
     *
     * RES_BODY_FORMAT_*以外の定数が渡されたら、何も処理しない
     *
     * @api
     * @param int $format HTTPレスポンスボディの形式
     * @return self 自分自身を返す
     * @uses self::RES_BODY_FORMAT_TEXT プレーンテキスト形式
     * @uses self::RES_BODY_FORMAT_HTML HTML形式
     * @uses self::RES_BODY_FORMAT_JSON JSONフォーマット形式
     */
    public function setBodyFormat($format)
    {
        switch ($format) {

            case self::RES_BODY_FORMAT_TEXT:

                $this->setHeader('Content-Type', 'text/plain charset=UTF-8');
                $this->responseBodyFormat = $format;
                break;

            case self::RES_BODY_FORMAT_HTML:

                $this->setHeader('Content-Type', 'text/html charset=UTF-8');
                $this->responseBodyFormat = $format;
                break;

            case self::RES_BODY_FORMAT_JSON:

                $this->setHeader(
                    'Content-Type',
                    'application/json charset=UTF-8'
                );
                $this->responseBodyFormat = $format;
                break;
        }

        return $this;
    }

    /**
     * HTTPレスポンスボディを設定する
     *
     * 引数の型がスカラー型、配列型、オブジェクト型以外であれば、何も処理しない
     *
     * @api
     * @param string|array|object $body HTTPレスポンスボディ
     * @return self 自分自身を返す
     * @todo 配列のキーのエンコードを変換
     */
    public function setBody($body)
    {
        if (is_scalar($body)) {

            $this->setBodyFormat(self::RES_BODY_FORMAT_TEXT);
            $this->body = mb_convert_encoding((string)$body, 'utf8', 'auto');

        } elseif (is_array($body) or is_object($body)) {

            $this->setBodyFormat(self::RES_BODY_FORMAT_JSON);
            $this->body = $body;

            // この関数は配列のキーは変換しない。格納順に影響するからと思われる
            // ToDO:暇があればキーも変換するようにする!!
            mb_convert_variables('utf8', null, $this->body);
        }

        return $this;
    }

    /**
     * HTTPレスポンスボディを取得する
     *
     * @api
     * @param bool $decode 真の時はデコードをする、偽の時はしない
     * @return string HTTPレスポンスボディ
     */
    public function getBody($decode = true)
    {
        if (is_null($this->body)) {

            return '';

        } elseif (is_string($this->body)) {

            return $this->body;

        } elseif (!$decode) {

            return $this->body;

        } else {

            switch ($this->responseBodyFormat) {

                case self::RES_BODY_FORMAT_JSON:

                    return $this->getJsonBody();
            }
        }

        return '';
    }

    /**
     * HTTPレスポンスボディをJSONエンコードして取得する
     *
     * @api
     * @param int $options json_encodeオプション
     * @param int $depth 最大の深さ
     * @return string JSONデコードされたHTTPレスポンスボディ、失敗時には'json encode failed!!'という文字列
     */
    public function getJsonBody(
        $options = JSON_UNESCAPED_UNICODE,
        $depth = 512
    ){
        $result = json_encode($this->body, $options, $depth);

        if ($result === false) {

            return 'json encode failed!!';
        }

        return $result;
    }
}
API documentation generated by ApiGen