1

Ajax を多用するアプリケーションの 1 つで構造的な問題が発生したため、最近 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_Controller拡張MY_Controllerする 拡張する を作成します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 に答える