2017-07-10 69 views
0

我有更多关于风格和组织的问题。我经常发现自己有一个需要多个Ajax调用的单个页面(控制器)。而不是仅仅为AJAX创建一个单独的控制器调用,因为这将意味着更多的控制器我只是做到以下几点:单独的AJAX控制器vs电流控制器?

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调用和视图控制器吗?

回答

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方式”加载和利用其他类(库)的做法相反。但我想这是一个不同的话题。

3

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

在我看来,你应该问自己下面,为了找到你应该放置你的ajax调用。

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

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