PHP通过单一入口点应用程序处理复杂请求

时间:2016-04-03 16:38:24

标签: php

我一直在使用PHP和JS开发一个包含用户,名册和日程管理的运动管理网站。这个应用程序有大约15个数据库表可以一起使用。最近我了解到我做了一些重大错误:我使用单独的PHP脚本作为他们自己的" apps"。

示例:单个脚本应用

JS

var params = {
   action : 'addGame',
   date : 'someday',
   hometeam : 1,
   awayteam : 2
}
$.post('/php/scheduler.php', params);

PHP

class Scheduler extends TableManager{

    public function addGame($date, $hometeam, $awayteam){
       // do sql stuff
    }

    public function doAction($request){
        switch($request){
            case "addGame":
                 return $this->addGame($_REQUEST['date'], $_REQUEST['hometeam'], $_REQUEST['awayteam'];
                 break;
        }
    }

    }

if(isset($_REQUEST['action'])){
   $scheduler = new Scheduler();
   $scheduler->doAction($_REQUEST['action']);
}

我了解到编写一个合适的PHP应用程序意味着应该有一个应用程序"所有请求都被路由的地方。这很好,我已经做到了 - 但现在我面临着未知的领域。如果我有15个表,并且它们都有一些非常具体的函数(它们都extend TableManager提供基本表函数,但有些显然更具体)我如何在主{{1}中编写请求处理器处理每个表的请求,而不会变得非常复杂?

示例:单一入口点应用

JS

App

PHP

var params = {
   action : 'addGame',
   table : 'scheduler',
   date : 'someday',
   hometeam : 1,
   awayteam : 2
}
$.post('/php/app.php', params);

现在我需要开始使用复杂且臃肿的switch语句,因为我的表都继承了class App { private $scheduleTable; public function createTable($name){ switch($name){ case "scheduler": $this->scheduleTable = new Scheduler(); break; } } public doAction($request){ switch($request){ case "addGame": $this->createTable('scheduler'); return $this->scheduleTable->addGame($_REQUEST['date'], $_REQUEST['hometeam'], $_REQUEST['awayteam']; break; } } } if(isset($_REQUEST['action'])){ $app = new App(); $app ->doAction($_REQUEST['action']); } ,因此执行了许多相同的操作,但也具有独特的功能。我需要在TableManager上传递switch,然后在actionswitch。更不用说这个table将拥有的所有其他功能(用户系统,一个)。写一个大规模的switch语句是唯一的答案吗?

1 个答案:

答案 0 :(得分:1)

据我了解你目前的困境,是的。您可以随时使用PHP框架(Google,有很多)但是如果您想使用现有结构,那么当然您需要一个switch语句或一种为页面加载正确模型的方法。

请注意,您可以使用以下内容:

<?php

    // I assume $request is sanitized.
    // Check to see if the class file exists.
    if( file_exists( 'class-directory/' . $request . '.inc.php' ) ) {
        $class_name = ucfirst( $request );
        $this->scheduleTable = new $class_name;
    } else {
        // Show error page, the request is not valid.
    }

?>

重要提示:为了提高安全性,您应该使用$ _POST,$ _GET和$ _COOKIE而不是$ _REQUEST。