Ajax CodeIgniter-替换redunant JSON转换
我最近开始使用Codeigniter,因为我的一个Ajax应用程序出现了结构问题。(如果你想进去,你可以仔细阅读) 我有一个相当简短的问题。目前,我正在向不同的控制器发出大量Ajax请求。我按如下方式打开控制器:Ajax CodeIgniter-替换redunant JSON转换,ajax,codeigniter,oop,design-patterns,Ajax,Codeigniter,Oop,Design Patterns,我最近开始使用Codeigniter,因为我的一个Ajax应用程序出现了结构问题。(如果你想进去,你可以仔细阅读) 我有一个相当简短的问题。目前,我正在向不同的控制器发出大量Ajax请求。我按如下方式打开控制器: public function __construct() { parent::__construct(); $this->output->set_content_type('application/json'); } 在每个函数结束时,我执行以下操
public function __construct()
{
parent::__construct();
$this->output->set_content_type('application/json');
}
在每个函数结束时,我执行以下操作:
$this->returnValue['result'] = "ReturnedInfo";
$this->returnValue = json_encode($this->returnValue);
$this->output->set_output($this->returnValue);
$this->output
->set_content_type('application/json')
->set_output(json_encode(array('foo' => 'bar')));
代码本身很清楚,但我不想重复我自己。codeigniter手册说明要执行以下操作:
$this->returnValue['result'] = "ReturnedInfo";
$this->returnValue = json_encode($this->returnValue);
$this->output->set_output($this->returnValue);
$this->output
->set_content_type('application/json')
->set_output(json_encode(array('foo' => 'bar')));
但我还是会重复我自己。此外,我不想为每个执行此操作的控制器添加一个函数,即使它确实减少了冗余
既然我的所有控制器都返回JSON,那么有没有办法在配置文件中全局设置JSON,或者以任何其他方式
TL;DR我在每个控制器/功能中都有相同的代码。由于输出类型总是相同的,只是结果不同,有没有一种方法可以跨每个控制器/功能自动执行此过程?创建一个扩展
MY\u控制器的Ajax\u控制器
,扩展CI\u控制器
。
然后,Ajax控制器将从两个控制器继承
class Ajax_Controller extends MY_Controller
{
public function __construct()
{
parent::__construct();
if(!$this->input->is_ajax_request()) return show_error('Invalid Request');
}
public function jsonOutput($json)
{
//some data checking here....
return $this->output
->set_content_type('application/json')
->set_header("HTTP/1.1 200 OK")
->set_output($json);
}
}
-
创建一个扩展CI\u控制器的myu控制器的Ajax\u控制器
。
然后,Ajax控制器将从两个控制器继承
class Ajax_Controller extends MY_Controller
{
public function __construct()
{
parent::__construct();
if(!$this->input->is_ajax_request()) return show_error('Invalid Request');
}
public function jsonOutput($json)
{
//some data checking here....
return $this->output
->set_content_type('application/json')
->set_header("HTTP/1.1 200 OK")
->set_output($json);
}
}
-
从自己的基类而不是CI_控制器扩展控制器,并将重复使用的函数和构造函数代码放在其中。比如:
class BaseController extends CI_Controller {
protected function index() {
$this->returnValue['result'] = "ReturnedInfo";
$this->returnValue = json_encode($this->returnValue);
$this->output->set_output($this->returnValue);
}
}
class Specific extends BaseController {
public function index() {
//do controller-specific stuff
parent::index();
}
}
如果我有一组具有共享代码的控制器,我会进一步抽象这一点;例如,如果我有一组需要用户登录的控制器,我会创建AuthenticatedController,它扩展BaseController并添加会话检查等。从您自己的基类而不是CI_控制器扩展控制器,并将重复使用的函数和构造函数代码放在其中。比如:
class BaseController extends CI_Controller {
protected function index() {
$this->returnValue['result'] = "ReturnedInfo";
$this->returnValue = json_encode($this->returnValue);
$this->output->set_output($this->returnValue);
}
}
class Specific extends BaseController {
public function index() {
//do controller-specific stuff
parent::index();
}
}
如果我有一组具有共享代码的控制器,我会进一步抽象这一点;例如,如果我有一组需要用户登录的控制器,我会创建AuthenticatedController,它扩展BaseController并添加会话检查等。太棒了,谢谢!完全忘记了继承,哈哈。不用担心,它也可以帮助你以不同的方式看待其他代码。太棒了,谢谢!完全忘记了继承,哈哈。不用担心,它也可以帮助你以不同的方式看待其他代码。谢谢你花时间来帮助我。这个答案也很好,但菲利普的例子对我来说更清楚了一点,他也稍微快了一点。谢谢你花时间来帮助我。这个答案也很好,但菲利普的例子对我来说更清楚一点,而且他稍微快一点。