PHP:在引用的对象上创建新方法

时间:2018-04-06 18:12:17

标签: php codeigniter

我正在使用Codeigniter框架。我想要实现的是在Codeigniter使用的超类上使用两个setter / getter方法:CI_Controller。

我已经创建了一个" hook"(类似于中间件),每次都会在执行控制器构造函数后运行:

class Response {
  public function init()
  {
      // load the instance
      $this->CI =& get_instance();

      $this->CI->response=array(
        'content'=> null,
        'status' => 'ok',
        'errorMessage' => null
    );

  }
}

此代码只会设置一个属性"响应"在对象上。我想创建一个吸气剂和一个二传手,但不知道如何。

我尝过这样的话:

$this->CI->setResponse = function($arr){
          foreach($arr as $key => $value){
              $this->data[$key] = $value;
          }
       }

当然它不起作用。

怎么做?

1 个答案:

答案 0 :(得分:1)

以下是Response_model通过autoload.php自动加载并将其保存在模型中。

class Response_model extends CI_Model {

    private $response = array();

    /**
     * Adds parameters to output
     * 
     * @param mixed $ka String key or array
     * @param type $value Value if using string
     * @return $this
     */
    public function add($ka, $value = null) {
        if (is_string($ka)) {
            $this->response = array_merge($this->response, array($ka => $value));
        } elseif (is_array($ka)) {
            $this->response = array_merge($this->response, $ka);
        }
        return $this;
    }

    /**
     * Status: success
     * 
     * @param type $msg
     * @return $this
     */
    public function success($msg = null) {

        $this->response = array('status' => 'success', 'msg' => $msg);
        return $this;
    }

    /**
     * Status: error
     * 
     * @param type $msg
     * @return $this
     */
    public function error($msg = null) {

        $this->response = array('status' => 'error', 'msg' => $msg);
        return $this;
    }

    /**
     * Gets form_validation errors
     * 
     * @return $this
     */
    public function form_errors() {
        $this->load->library('form_validation');
        $errors = array();
        foreach ($this->form_validation->error_array() as $field_name => $error) {
            $errors[] = array('id' => $field_name, 'msg' => $error);
        }
        $this->response = array('status' => 'error', 'form_errors' => $errors);
        return $this;
    }

    /**
     * Straight output, no status or msg
     * 
     * @param mixed $output
     * @return $this
     */
    public function output($output) {
        $this->response = $output;
        return $this;
    }

    /**
     * Renders JSON response
     * e.g. {"status":"error","msg":"some_error","some_value":"some_key"}
     * with the appropriate headers
     * 
     * @param boolean $exit TRUE (default) exits()
     * @param string|array $json_params e.g. array(JSON_NUMERIC_CHECK, JSON_HEX_TAG)
     * @return void
     */
    public function json($exit = true, $json_params = null) {
        $this->output->set_content_type('application/json');
        if (is_null($json_params)) {
            $this->output->set_output(json_encode($this->response));
        } else {
            if (is_array($json_params)) {
                $params = implode(' | ', $json_params);
            } else {
                $params = $json_params;
            }
            $this->output->set_output(json_encode($this->response, $params));
        }
        $this->output->_display();
        if ($exit) {
            exit;
        }
    }

    /**
     * Renders javascript output
     * 
     * @param boolean $exit TRUE (default) exits()
     */
    public function js($exit = true) {
        $this->output->set_content_type('application/javascript');
        $this->output->set_output($this->response);
        $this->output->_display();
        if ($exit) {
            exit;
        }
    }

    /**
     * Renders HTML response
     * 
     * @param boolean $exit TRUE (default) exits()
     * @return void
     */
    public function html($exit = true) {
        $this->output->set_content_type('html');
        $this->output->set_output($this->response);
        $this->output->_display();
        if ($exit) {
            exit;
        }
    }

}

当您想要设置json响应时的用法:

$this->response->success('Some message')->add(array('somevar' => $somevar))->json();

只要它被自动加载(或加载到MY_Controller中的application/core并且后续控制器扩展MY_Controller$this->response全局可用,就像任何其他模型或库一样你全球加载。