1

在我的一个 Ajax 重应用程序中遇到结构问题后,我最近开始使用 Codeigniter。(如果您愿意,可以在我之前的问题中阅读它)

我有一个相当简短的问题。目前我正在向不同的控制器发出很多 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);

代码本身很清楚,但我不想重复自己。codeigniter 手册说要执行以下操作:

$this->output
    ->set_content_type('application/json')
    ->set_output(json_encode(array('foo' => 'bar')));

但我还是会重复自己。此外,我不想为执行此操作的每个控制器添加一个功能,即使它确实减少了冗余。

由于我所有的控制器都返回 JSON,有没有办法在配置文件中全局设置它,或者以任何其他方式?

TL;DR我在每个控制器/功能中都有相同的代码。由于输出类型总是相同的,只是结果不同,有没有办法在每个控制器/功能上自动化这个过程?

4

2 回答 2

3

创建一个Ajax_Controllerthat extends MY_Controllerthat extends CI_Controller。然后,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);
   }
}

-

class User extends Ajax_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function userMethod()
    {
        $json = json_encode(array(
            '' => ''
        ));
        $this->jsonOutput($json);
    }
}
于 2013-05-15T08:27:07.047 回答
1

从您自己的基类而不是 CI_Controller 扩展您的控制器,并将您重复使用的函数和构造函数代码放在那里。就像是:

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

于 2013-05-15T08:28:31.873 回答