我一直在开发一个体育管理网站,使用PHP和JS进行用户、花名册和日程管理。这个应用程序总共有大约15个数据库表可供使用。最近,我发现自己做错了一件事:我把单个PHP脚本用作自己的"应用程序"。
示例:个人脚本应用
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
来提供基本的表函数,但有些显然更具体),我如何在我的主App
中编写一个请求处理器来处理每个表的请求,而不会变得异常复杂?
示例:单一入口点应用
JS
var params = {
action : 'addGame',
table : 'scheduler',
date : 'someday',
hometeam : 1,
awayteam : 2
}
$.post('/php/app.php', params);
PHP
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
,因此可以执行许多相同的操作,但也有独特的功能。我需要在传入的action
上使用switch
,然后在table
上使用switch
。更不用说这个App
将具有的所有其他功能(例如用户系统)。写一个巨大的switch语句的唯一答案是什么?
根据我对你目前困境的理解,是的。你可以一直使用PHP框架(谷歌一下,有很多),但如果你想使用现有的结构,那么你当然需要一个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。