0

私は他の何ものでもスタイルや組織に関して質問があります。私はしばしば、複数のajax呼び出しを必要とする単一のページ(コントローラ)を持っていることがよくあります。AJAXコントローラとカレントコントローラは別々ですか?

class Management extends MY_Controller 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->protect->protect(); 
     if ($this->uri->segment(2, 0) !== 0 && !$this->input->is_ajax_request()) { 
      exit('No direct script access allowed'); 
     } 
    } 

    public function index() 
    { 
     $this->load->model('management_model'); 
     $data['row_config'] = $this->management_model->getConfigRows(); 
     $data['row_users'] = $this->management_model->getUsers(); 
     $data['roles'] = $this->management_model->getRoles(); 
     $this->tpl->head(); 
     $this->load->view('management/scripts'); 
     $this->tpl->body(); 
     if ($this->messages->hasMessages()) { 
      $this->output->append_output($this->messages->display()); 
     } 
     $this->load->view('management/manage', $data); 
     $this->load->view('management/current_users', $data); 
     $this->load->view('management/modals', $data); 
     $this->tpl->footer(); 
    } 

    public function get_user_details() 
    { 
     $user = new \Auth\ASUser($_POST['userId']); 
     echo json_encode($user->getAll()); 
    } 

    public function delete_user() 
    { 
     $user = new \Auth\ASUser($_POST['userId']); 
     $user->deleteUser(true); 
    } 

インデックスは、私が実際に適切なビューをレンダリングする必要がある唯一のページがあるので、残り:それは、次の私はやる以上のコントローラを意味しますので、むしろちょうどAJAXのための別のコントローラを作成するよりは、呼び出し、私はちょうどインデックス以外のものが存在するかどうかを確認するためにURIセグメントをチェックし、そのajax要求があるかどうかを確認します。

この悪い習慣ですか? AJAX呼び出しとView Controllerを分離する必要がありますか?

答えて

1

あなたの質問は、Stack OverflowのSOPに反する意見を求めています。しかし、私はとにかく私の意見を提供します。

これはです。は練習ですか?私はそうは思わない。つまり、コントローラを必要以上に大きくするのはなぜですか? Ajaxが一部のページで完全なCRUD機能を処理している場合、コントローラはかなり大きくなる可能性があります。あなたは別のコントローラーでより良いサービスを提供することができます。

Ajax呼び出しは、サーバーとは別の要求です。これは、ブラウザを別のブラウザタブの別のページに誘導することと基本的に同じです。なぜAjax専用のコントローラにそのリクエストを送信しないのですか?そのようなコントローラーがより良い「分離の懸念」を生み出すと主張することができます。それはよい習慣です。

このコントローラーがajax呼び出しによって要求された場合にのみ使用されることを確認する1つの手法があります。コントローラー内の2行のコードで判定が行われます。

class Some_ajax_handler extends CI_Controller 
{ 
    public function __construct() 
    { 
     if(!is_ajax()){ 
      show_404(); 
     } 
     parent :: __construct(); 
     //if needed, do the rest of your construct here 
    } 

    public function get_user_details() 
    { 
    $user = new \Auth\ASUser($_POST['userId']); 
    echo json_encode($user->getAll()); 
    } 
} 

show_404();の呼び出しはexit()への呼び出しで終了しますので、コントローラにreturn;文またはelseブロックを必要としません。このコントローラで呼び出されるメソッドは、実際にはAjaxリクエストであると確信できます。

一方、コントローラのビューでAjaxを使用して選択入力やその他の単純なGET呼び出しのコンテンツを取得した場合、別のコントローラを作成することは過度のようです。

ところで、面白いと思われるAjaxコールHEREを簡略化するCIライブラリがあります。

私が提供する1つの批判は、他のクラス(ライブラリ)を読み込んで利用するための "Codeigniter way"に反する、Ajaxについてではなく、newの使用についてです。しかし、私はそれが別の話題だと思う。

3

正直なところ、あなたのAjax関数をどこに追加すべきか、特にCodeigniterの構造の大部分が緩やかに結合されているパターンがあるとは思わない。

私の意見では、あなたはあなたのajax呼び出しを配置する場所を見つけるためにあなた自身に以下の質問をするべきです。

  1. ajaxコールから返されたデータはコントローラに関連していますか?
  2. もう一度同じ方法または機能を別のコントローラまたは別の場所で使用しますか?
  3. コントローラの定義済みのコンストラクタが必要ですか?これはajaxコールを配置する必要があると思いますか?
  4. 私はソフトウェア開発のDRY principleに数えますか?
  5. 私のコードはフレキシブルで再利用可能ですか?

各プロジェクトには独自の哲学とワークフローがあります。あなたが決定するデザインパターンとデータ構造は、あなたのコーディングスタイルであなたの質問のほとんどを解決します。

関連する問題