<?php 
 | 
/** 
 | 
 * PhalApi_Response 响应类 
 | 
 * 
 | 
 * - 拥有各种结果返回状态 ,以及对返回结果 的格式化 
 | 
 * - 其中:200成功,400非法请求,500服务器错误 
 | 
 * 
 | 
 * @package     PhalApi\Response 
 | 
 * @license     http://www.phalapi.net/license GPL 协议 
 | 
 * @link        http://www.phalapi.net/ 
 | 
 * @author      dogstar <chanzonghuang@gmail.com> 2014-10-02 
 | 
 */ 
 | 
  
 | 
abstract class PhalApi_Response { 
 | 
  
 | 
    /** 
 | 
     * @var int $ret 返回状态码,其中:200成功,400非法请求,500服务器错误 
 | 
     */ 
 | 
    protected $ret = 200; 
 | 
     
 | 
    /** 
 | 
     * @var array 待返回给客户端的数据 
 | 
     */ 
 | 
    protected $data = array(); 
 | 
     
 | 
    /** 
 | 
     * @var string $msg 错误返回信息 
 | 
     */ 
 | 
    protected $msg = ''; 
 | 
     
 | 
    /** 
 | 
     * @var array $headers 响应报文头部 
 | 
     */ 
 | 
    protected $headers = array(); 
 | 
  
 | 
    /** 
 | 
     * @var array $debug 调试信息 
 | 
     */ 
 | 
    protected $debug = array(); 
 | 
  
 | 
    /** ------------------ setter ------------------ **/ 
 | 
  
 | 
    /** 
 | 
     * 设置返回状态码 
 | 
     * @param int $ret 返回状态码,其中:200成功,400非法请求,500服务器错误 
 | 
     * @return PhalApi_Response 
 | 
     */ 
 | 
    public function setRet($ret) { 
 | 
        $this->ret = $ret; 
 | 
        return $this; 
 | 
    } 
 | 
     
 | 
    /** 
 | 
     * 设置返回数据 
 | 
     * @param array/string $data 待返回给客户端的数据,建议使用数组,方便扩展升级 
 | 
     * @return PhalApi_Response 
 | 
     */ 
 | 
    public function setData($data) { 
 | 
        $this->data = $data; 
 | 
        return $this; 
 | 
    } 
 | 
     
 | 
    /** 
 | 
     * 设置错误信息 
 | 
     * @param string $msg 错误信息 
 | 
     * @return PhalApi_Response 
 | 
     */ 
 | 
    public function setMsg($msg) { 
 | 
        $this->msg = $msg; 
 | 
        return $this; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 设置调试信息 
 | 
     * @param   string  $key        键值标识 
 | 
     * @param   mixed   $value      调试数据 
 | 
     * @return  PhalApi_Response 
 | 
     */ 
 | 
    public function setDebug($key, $value) { 
 | 
        if (DI()->debug) { 
 | 
            $this->debug[$key] = $value; 
 | 
        } 
 | 
        return $this; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 添加报文头部 
 | 
     * @param string $key 名称 
 | 
     * @param string $content 内容 
 | 
     */ 
 | 
    public function addHeaders($key, $content) { 
 | 
        $this->headers[$key] = $content; 
 | 
    } 
 | 
  
 | 
    /** ------------------ 结果输出 ------------------ **/ 
 | 
  
 | 
    /** 
 | 
     * 结果输出 
 | 
     */ 
 | 
    public function output() { 
 | 
        $this->handleHeaders($this->headers); 
 | 
  
 | 
        $rs = $this->getResult(); 
 | 
  
 | 
        echo $this->formatResult($rs); 
 | 
    } 
 | 
     
 | 
    /** ------------------ getter ------------------ **/ 
 | 
     
 | 
    /** 
 | 
     * 根据状态码调整Http响应状态码 
 | 
     */ 
 | 
    public function adjustHttpStatus() { 
 | 
        $httpStatus = array (  
 | 
            100 => 'HTTP/1.1 100 Continue',  
 | 
            101 => 'HTTP/1.1 101 Switching Protocols',  
 | 
            200 => 'HTTP/1.1 200 OK',  
 | 
            201 => 'HTTP/1.1 201 Created',  
 | 
            202 => 'HTTP/1.1 202 Accepted',  
 | 
            203 => 'HTTP/1.1 203 Non-Authoritative Information',  
 | 
            204 => 'HTTP/1.1 204 No Content',  
 | 
            205 => 'HTTP/1.1 205 Reset Content',  
 | 
            206 => 'HTTP/1.1 206 Partial Content',  
 | 
            300 => 'HTTP/1.1 300 Multiple Choices',  
 | 
            301 => 'HTTP/1.1 301 Moved Permanently',  
 | 
            302 => 'HTTP/1.1 302 Found',  
 | 
            303 => 'HTTP/1.1 303 See Other',  
 | 
            304 => 'HTTP/1.1 304 Not Modified',  
 | 
            305 => 'HTTP/1.1 305 Use Proxy',  
 | 
            307 => 'HTTP/1.1 307 Temporary Redirect',  
 | 
            400 => 'HTTP/1.1 400 Bad Request',  
 | 
            401 => 'HTTP/1.1 401 Unauthorized',  
 | 
            402 => 'HTTP/1.1 402 Payment Required',  
 | 
            403 => 'HTTP/1.1 403 Forbidden',  
 | 
            404 => 'HTTP/1.1 404 Not Found',  
 | 
            405 => 'HTTP/1.1 405 Method Not Allowed',  
 | 
            406 => 'HTTP/1.1 406 Not Acceptable',  
 | 
            407 => 'HTTP/1.1 407 Proxy Authentication Required',  
 | 
            408 => 'HTTP/1.1 408 Request Time-out',  
 | 
            409 => 'HTTP/1.1 409 Conflict',  
 | 
            410 => 'HTTP/1.1 410 Gone',  
 | 
            411 => 'HTTP/1.1 411 Length Required',  
 | 
            412 => 'HTTP/1.1 412 Precondition Failed',  
 | 
            413 => 'HTTP/1.1 413 Request Entity Too Large',  
 | 
            414 => 'HTTP/1.1 414 Request-URI Too Large',  
 | 
            415 => 'HTTP/1.1 415 Unsupported Media Type',  
 | 
            416 => 'HTTP/1.1 416 Requested range not satisfiable',  
 | 
            417 => 'HTTP/1.1 417 Expectation Failed',  
 | 
            500 => 'HTTP/1.1 500 Internal Server Error',  
 | 
            501 => 'HTTP/1.1 501 Not Implemented',  
 | 
            502 => 'HTTP/1.1 502 Bad Gateway',  
 | 
            503 => 'HTTP/1.1 503 Service Unavailable',  
 | 
            504 => 'HTTP/1.1 504 Gateway Time-out', 
 | 
            505 => 'HTTP/1.1 505 HTTP Version not supported',   
 | 
        ); 
 | 
  
 | 
        $str = isset($httpStatus[$this->ret]) ? $httpStatus[$this->ret] : "HTTP/1.1 {$this->ret} PhalApi Unknown Status"; 
 | 
        @header($str); 
 | 
  
 | 
        return $this; 
 | 
    } 
 | 
  
 | 
    public function getResult() { 
 | 
        $rs = array( 
 | 
            'ret'   => $this->ret, 
 | 
            'data'  => $this->data, 
 | 
            'msg'   => $this->msg, 
 | 
        ); 
 | 
  
 | 
        if (!empty($this->debug)) { 
 | 
            $rs['debug'] = $this->debug; 
 | 
        } 
 | 
  
 | 
        return $rs; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取头部 
 | 
     *  
 | 
     * @param string $key 头部的名称 
 | 
     * @return string/array 对应的内容,不存在时返回NULL,$key为NULL时返回全部 
 | 
     */ 
 | 
    public function getHeaders($key = NULL) { 
 | 
        if ($key === NULL) { 
 | 
            return $this->headers; 
 | 
        } 
 | 
  
 | 
        return isset($this->headers[$key]) ? $this->headers[$key] : NULL; 
 | 
    } 
 | 
  
 | 
    /** ------------------ 内部方法 ------------------ **/ 
 | 
  
 | 
    protected function handleHeaders($headers) { 
 | 
        foreach ($headers as $key => $content) { 
 | 
            @header($key . ': ' . $content); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 格式化需要输出返回的结果 
 | 
     * 
 | 
     * @param array $result 待返回的结果数据 
 | 
     * 
 | 
     * @see PhalApi_Response::getResult() 
 | 
     */ 
 | 
    abstract protected function formatResult($result); 
 | 
} 
 |