如何制作一个包装器来调用不同 类 中的函数?
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'];
我正在尝试解决 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'];