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

PHP通过单入口点应用程序处理复杂请求,php,Php,我一直在开发一个体育管理网站,使用PHP和JS进行用户、花名册和日程管理。这个应用程序总共有大约15个数据库表可以使用。最近,我发现自己做错了一件事:我把单个PHP脚本用作自己的“应用程序” 示例:单个脚本应用程序 JS var params = { action : 'addGame', date : 'someday', hometeam : 1, awayteam : 2 } $.post('/php/scheduler.php', params); var pa

我一直在开发一个体育管理网站,使用PHP和JS进行用户、花名册和日程管理。这个应用程序总共有大约15个数据库表可以使用。最近,我发现自己做错了一件事:我把单个PHP脚本用作自己的“应用程序”

示例:单个脚本应用程序

JS

var params = {
   action : 'addGame',
   date : 'someday',
   hometeam : 1,
   awayteam : 2
}
$.post('/php/scheduler.php', params);
var params = {
   action : 'addGame',
   table : 'scheduler',
   date : 'someday',
   hometeam : 1,
   awayteam : 2
}
$.post('/php/app.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']);
}
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']);
}
我了解到,编写一个合适的PHP应用程序意味着应该有一个“应用程序”来路由所有请求。这很好,我已经做到了——但现在我面临未知领域。如果我有15个表,它们都有一些非常特定的函数(它们都是
扩展TableManager
来提供基本的表函数,但有些显然更具体),我如何在我的主
应用程序中编写一个请求处理器来处理每个表的请求,而不会变得异常复杂

示例:单入口点应用程序

JS

var params = {
   action : 'addGame',
   date : 'someday',
   hometeam : 1,
   awayteam : 2
}
$.post('/php/scheduler.php', params);
var params = {
   action : 'addGame',
   table : 'scheduler',
   date : 'someday',
   hometeam : 1,
   awayteam : 2
}
$.post('/php/app.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']);
}
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']);
}

现在,我需要开始使用复杂且臃肿的switch语句,因为我的表都继承了
TableManager
,因此执行许多相同的操作,但也具有独特的功能。我需要在传入的
操作上切换
,然后在
表上切换
。更不用说这个
应用程序将拥有的所有其他功能(例如用户系统)。写一篇大规模的转换声明的唯一答案是什么?

根据我对你目前困境的理解,是的。您可以始终使用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.
    }

?>


重要提示:为了获得更高的安全性,您应该使用$\u POST、$\u GET和$\u COOKIE而不是$\u REQUEST。

。您应该看看php框架,例如Symfony或Laravel,它们为您处理低级细节(例如路由)。我去写了自己的路由器。对于像我这样的小应用程序,只需要几个小时。如果我所有的
$\u请求
值都使用PDO绑定到语句中,有什么区别吗?这只是为了防止根据
$\u获取
$\u发布
$\u COOKIE
处理成
$\u请求
的顺序重写值。请注意,即使您继续使用
$\u REQUEST
,您仍然可以使用我的解决方案。