如何制作一个包装器来调用不同 类 中的函数?

How to make a wrapper to call functions in different classes?

我正在尝试解决 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();
}

如果您想查看一个 class click here 的完整结构。 问题是这段代码应该放在每个控制器里面, 并且你必须设置所有提供的方法,有时可用的功能达到五十,导致放弃这个解决方案...... 我想知道的是:如何制作一个包装器,一个 class 允许我从 url 调用控制器的方法并执行它?

之前所有这些工作都是由 CodeIgniter 完成的。所以现在我必须编写自己的 class,使我能够轻松访问控件并调用不同 class 中的方法。 所有必须响应 ajax 请求的 classes 驻留在 application/controllers / ... 文件夹中。在控制器文件夹中我有 20 个控制器。

您可以添加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 post 中:

var postUrl = GlobalVariables.baseUrl + 'application/controllers/ajax.php/user.php/ajax_check_login';

如果您有 apache,那么即使不添加 ajax.php 也可以通过将其添加到控制器目录中的 .htaccess 来实现:

RewriteEngine On
RewriteBase /baseUrl.../application/controllers/
RewriteRule ^([^\.]*\.php)/[^/]*$ ajax.php?file=&func=

当然你需要你真正的 baseUrl 在那里。并将 php 中的前 3 行更改为:

$class = $_GET['class'];
$func = $_GET['func'];