我正在使用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;
}
}
当然它不起作用。
怎么做?
答案 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
全局可用,就像任何其他模型或库一样你全球加载。