将AJAX控制器与电流控制器分开?

时间:2017-07-10 11:04:38

标签: ajax codeigniter coding-style codeigniter-3 code-structure

我还有一个关于风格和组织的问题。我经常发现自己有一个页面(控制器)需要多个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调用和视图控制器吗?

2 个答案:

答案 0 :(得分:3)

老实说,我不认为你应该在哪里添加你的ajax函数,特别是在Codeigniter中,它的大部分结构都是松散耦合的。

在我看来,你应该问自己下面的内容,以便找到你应该放置你的ajax电话的地方。

  1. 来自ajax调用的返回数据是否与我相关的控制器?
  2. 我会在另一个控制器或其他地方再次使用相同的方法/功能吗?
  3. 我是否需要已定义的Controller构造函数,我认为我应该进行ajax调用?
  4. 我依靠DRY principle软件开发吗?
  5. 我的代码是否灵活,可重复使用等?
  6. 每个项目都有自己的理念和工作流程。您将遵循的设计模式和数据结构将以您的编码风格解决您的大部分问题。

答案 1 :(得分:1)

您的问题是提出与Stack Overflow的SOP相反的意见。但无论如何我会提出我的意见。

这是糟糕练习吗?我不这么认为。也就是说,为什么要让控制器大于它需要的?如果您的Ajax正在处理某个页面的完整CRUD功能,那么控制器可能会非常大。单独的控制器可能会为您提供更好的服务。

Ajax调用是对服务器的不同请求 - 基本上与将浏览器定向到其他浏览器选项卡上的单独页面相同。为什么不将该请求发送给专用于Ajax的控制器?可以说,这样的控制器会产生更好的“关注点分离”。这是一种很好的做法。

有一种技术可以确保此控制器仅在ajax调用请求时使用。控制器中的几行代码将作出决定。

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调用的内容,那么创建一个单独的控制器似乎有点过分。

顺便说一下,有一个CI库可以简化您可能感兴趣的Ajax调用HERE

我提出的一个批评不是关于ajax,而是关于你使用new与“Codeigniter方式”相反的加载和利用其他类(库)的问题。但我想这是一个不同的主题。