Ajax CodeIgniter-替换redunant JSON转换

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'); } 在每个函数结束时,我执行以下操

我最近开始使用Codeigniter,因为我的一个Ajax应用程序出现了结构问题。(如果你想进去,你可以仔细阅读)

我有一个相当简短的问题。目前,我正在向不同的控制器发出大量Ajax请求。我按如下方式打开控制器:

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并添加会话检查等。

太棒了,谢谢!完全忘记了继承,哈哈。不用担心,它也可以帮助你以不同的方式看待其他代码。太棒了,谢谢!完全忘记了继承,哈哈。不用担心,它也可以帮助你以不同的方式看待其他代码。谢谢你花时间来帮助我。这个答案也很好,但菲利普的例子对我来说更清楚了一点,他也稍微快了一点。谢谢你花时间来帮助我。这个答案也很好,但菲利普的例子对我来说更清楚一点,而且他稍微快一点。