我对ajax做了很多研究,但似乎找不到太多关于使用codeigniter创建单独的ajax层的信息。。。我在代码点火器上执行教程视频的目录树中看到过ajax控制器,但从未得到真正的解释。我假设它是为了促进封装,并且只向启用了javascript之类的用户显示,只是不知道如何在控制器中实现它,以便在我自己的项目中使用。
这一切都取决于你在做什么。在我看来,最简单的方法不是使用单独的AJAX控制器和url,而是在控制器中检测请求并输出与正常情况不同的内容。Input类有一个功能:
/**
* Is ajax Request?
*
* Test to see if a request contains the HTTP_X_REQUESTED_WITH header
*
* @return boolean
*/
public function is_ajax_request()
{
return ($this->server('HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest');
}
我更喜欢使用常数:
/**
* Is this an ajax request?
*
* @return bool
*/
define('AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest');
控制器方法中的示例用法:
$data = $this->some_model->get();
if ($this->input->is_ajax_request())
{
// AJAX request stops here
exit(json_encode($data));
}
$this->load->view('my_view', $data);
这样,您就不会有相同或相似的应用程序逻辑分布在几个不同的控制器中,并且您的代码可以更易于维护。例如,您的标准HTML表单可以使用AJAX发布到相同的位置,并具有不同的输出,因此它也有助于使渐进增强更容易、更干净。此外,您将不会有需要对用户"隐藏"的"仅AJAX"URL。
我将尝试提供一个我过去使用过的简单解决方案。然而,我不确定您是否熟悉CodeIgniter,而且这是我自己开发的"自制"解决方案,用于处理CodeIgnitr中的问题。
我喜欢CodeIgniter,因为它简单,占地面积小。但它的某些功能我不使用:我不使用提供的数据库连接系统,因为我有点控制狂,SQL注入非常普遍。因此,出于这个原因,我学会了如何在框架内偏离。
为了创建一个单独的"层"来容纳AJAX处理,并在实现中保持它的整洁,我只制作了一个独立的控制器对象,其具体工作是响应AJAX请求。通过这种方式,您的"网页"控制器与您的"Ajax"控制器是分开的。
class Ajax extends CI_Controller
{
function __construct(){ parent::__construct();}
function webserv(){ /* Your Web Service code here... */}
}
然后你会把你的AJAX请求指向这个URL:
http://www.example.com/ajax/webserv/