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

Separate AJAX controller vs current controller?

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

您的问题是在询问与 Stack Overflow 的 SOP 相悖的意见。不过我还是提一下我的意见吧。

这是不好的做法吗?我不这么认为。也就是说,为什么要使控制器比需要的更大?如果您的 Ajax 正在处理某些页面的完整 CRUD 功能,那么控制器可能会非常大。单独的控制器可能会更好地为您服务。

Ajax 调用是对服务器的不同请求 - 本质上与将浏览器定向到其他浏览器选项卡上的单独页面相同。为什么不向专用于 Ajax 的控制器发出该请求?可以说这样的控制器产生更好的 "Separation of Concerns"。这是很好的做法。

有一种技术可以确保此控制器仅在 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 来获取 select 输入或其他一些简单的 GET 调用的内容,那么创建一个单独的控制器似乎有点过分了。

顺便说一句,有一个 CI 库简化了 Ajax 调用 HERE,您可能会感兴趣。

我提出的一个批评不是关于 ajax,而是关于你对 new 的使用,这与 "Codeigniter way" 加载和利用其他 类(库)。但我想那是另一个话题。

老实说,我不认为应该在何处添加 ajax 函数,尤其是在 Codeigniter 中,它的大部分结构都是松散耦合的。

在我看来,您应该问问自己以下问题,以便找到您应该在哪里拨打 ajax 电话。

  1. ajax 调用返回的数据是否与我已经使用的 Controller 相关?
  2. 我会在另一个控制器或其他地方再次使用相同的 method/functionality 吗?
  3. 我是否需要已定义的控制器构造函数,我认为我应该调用 ajax?
  4. 我指望软件开发 DRY principle 吗?
  5. 我的代码是否灵活、可重用等?

每个项目都有自己的理念和工作流程。您决定要遵循的设计模式和数据结构将解决您编码风格中的大部分问题。