如何使包装器调用不同类中的函数?

时间:2016-01-28 21:03:47

标签: php ajax wrapper

我试图解决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个控制器。

1 个答案:

答案 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'];