调用变量方法来处理ajax请求

时间:2017-05-10 14:10:24

标签: php oop

我制作了一个controller.php文件来处理ajax请求,使用$ _POST参数actionmodule

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的切换案例并调用相应的方法。这将导致更多的代码,这是我选择这种变量方法解决方案的最初原因。

1 个答案:

答案 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自动加载器