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;
}
}