我试图解决ajax中的一个问题,这个问题是从我的客户端要求我不使用任何框架进行Web应用程序的那一刻开始的。 我一直使用CodeIgniter,我从来没有遇到过ajax请求的任何问题,特别是当我不得不调用一个方法只是执行这个调用时:
var postUrl = GlobalVariables.baseUrl + 'application/controllers/user.php/ajax_check_login';
//http://localhost/App_Name/application/controllers/user.php/ajax_check_login <-postUrl content
var postData =
{
'username': $('#username').val(),
'password': $('#password').val()
};
$.post(postUrl, postData, function(response)
{
// do stuff...
});
如何从上面的代码中看到我想要做的是调用名为user.php
的控制器ajax_check_login
中的方法。
到目前为止,我所做的是为了达到预期的结果:制作这段代码:
$allowed_functions = array('ajax_check_login');
$ru = $_SERVER['REQUEST_URI']
$func = preg_replace('/.*\//', '', $ru);
if (isset($func) && in_array($func, $allowed_functions)) {
$user = new User();
$user->$func();
}
如果您想查看类click here的完整结构。 问题是这个代码应该放在每个控制器里面, 并且你必须设置所提供的所有方法,有时可用的功能达到50,导致丢弃此解决方案...... 我想知道的是:如何创建一个包装器,一个允许我从url调用控制器方法并执行它的类?
在所有这些工作由CodeIgniter完成之前。所以现在我必须编写自己的类,允许我轻松访问控件并调用不同类中的方法。 所有必须响应ajax请求的类都驻留在application / controllers / ...文件夹中。在控制器文件夹中,我有20个控制器。
答案 0 :(得分:1)
您可以添加ajax.php:
<?php
preg_match_all('/([^\/.]*)\.php\/([^\/]*)$/', $_SERVER['REQUEST_URI'], $matches);
$class = $matches[1][0];
$func = $matches[2][0];
$allowed_classes = array('user','account','foo');
if (isset($class) && isset($func) && in_array($class, $allowed_classes)) {
require_once "application/controllers/" . $class. ".php";
// here you could do some security checks about the requested function
// if not, then all the public functions will be possible to call
// for example if you don't want to allow any function to be called
// you can add a static function to each class:
// static function getAllowedFunctions() {return array('func1','func2');}
// and use it the same way you had checked it in the question
$obj = new $class();
$obj->$func();
// or if need to pass $_POST:
// call_user_func(array($obj, $func, $_POST));
}
并在javascript帖子中发布:
var postUrl = GlobalVariables.baseUrl + 'application/controllers/ajax.php/user.php/ajax_check_login';
如果你有apache,那么你甚至可以通过将它添加到控制器目录中的.htaccess来添加ajax.php来实现它:
RewriteEngine On
RewriteBase /baseUrl.../application/controllers/
RewriteRule ^([^\.]*\.php)/[^/]*$ ajax.php?file=$1&func=$2
当然,你需要真正的baseUrl。并将php中的前3行更改为:
$class = $_GET['class'];
$func = $_GET['func'];