我制作了一个controller.php文件来处理ajax请求,使用$ _POST参数action
和module
if (isset($_POST["action"])) {
$action = strtolower($_POST["action"]);
if ($action === "get_notification") {
// return session notification messages
//...
} elseif (isset($_POST["module"])) {
require_once("libraries/class.module.php");
$module = new Module;
$moduleName = strtolower($_POST["module"]);
// check if module-name is valid
if ($module->verify($moduleName)) {
// load $modulename class
require_once("libraries/class.".$moduleName.".php");
// factory used to create instance of $moduleName
require_once("libraries/class.factory.php");
// note: moduleName class extends Module class
$module = $Factory->create($moduleName);
// verify method of $moduleName verifies action/method parameter
// using method_exists and cross-checking against a permitted methods list
if ($module->verify($action)) {
$message = $module->$action();
echo json_encode($message);
} else {
// handle invalid requests
echo json_encode(["0", "Invalid request received"]);
}
} else {
// handle invalid requests
echo json_encode(["0", "Invalid request received"]);
}
} else {
// handle invalid requests
echo json_encode(["0", "Invalid request received"]);
}
} else {
// handle invalid requests
echo json_encode(["0", "No request received"]);
}
但我在Stack Overflow上阅读this帖子,建议不要使用变量方法。我应该选择检查每个$action
的切换案例并调用相应的方法。这将导致更多的代码,这是我选择这种变量方法解决方案的最初原因。
答案 0 :(得分:0)
看起来你真正需要的是一个合适的路由系统。你可以自己做(如here所述)。或者使用现有的解决方案,例如FastRoute。
至于实际使用“变量方法”,一般来说这是一个坏主意。但是,如果这些方法位于调用堆栈的开头(从bootstrap文件执行),它们是一个非常实用的选项。
当涉及到安全问题时,控制器类中唯一的公共方法应该是您期望被调用的方法。这意味着你可以做到:
import openWebsite from '../support/action/openWebsite';
import LoginPage from '../pageobject/LoginPage/LoginPage';
module.exports = function given() {
this.Given(
/^I open salesforce login page$/,
openWebsite
);
this.When(
/^I set user "([^"]*)?" and password "([^"]*)?"$/, function(arg1,arg2) {
LoginPage.open();
LoginPage.username.setValue(arg1)
LoginPage.password.setValue(arg2)
});
this.And(
/^I click the login button$/,function(){
LoginPage.open();
LoginPage.submit();
});
}
PS 您不必在那里if (method_exists($controller, $action)) {
,因为在PHP中,类方法不区分大小写(并且类名都不是他们自己)。
P.P.S。考虑使用composer作为PSR-4自动加载器