作为后端REST服务处理多个PHP脚本的最佳方法?

作为后端REST服务处理多个PHP脚本的最佳方法?,php,ajax,rest,design-patterns,Php,Ajax,Rest,Design Patterns,我有一个典型的网站设置,我使用AJAX与PHP脚本进行通信,然后PHP脚本将数据读写到MySQL数据库。在我以前的项目中,我需要编写的PHP脚本数量很少,因为我需要读取或写入的数据没有太多变化。这个站点有点不同,我通常为每个AJAX调用创建不同的PHP脚本,这导致了大量的PHP脚本 我决定采用不同的方法,在同一个PHP脚本中对类似的查询进行分组。例如,如果我有以下通话: getGroupById getAllGroups createNewGroup 在我以前的方法中,我会有三个单独的php文件

我有一个典型的网站设置,我使用AJAX与PHP脚本进行通信,然后PHP脚本将数据读写到MySQL数据库。在我以前的项目中,我需要编写的PHP脚本数量很少,因为我需要读取或写入的数据没有太多变化。这个站点有点不同,我通常为每个AJAX调用创建不同的PHP脚本,这导致了大量的PHP脚本

我决定采用不同的方法,在同一个PHP脚本中对类似的查询进行分组。例如,如果我有以下通话:

getGroupById
getAllGroups
createNewGroup

在我以前的方法中,我会有三个单独的php文件,但现在我有一个可以完成所有这三个文件

随着项目的发展,我采取的第二种方法被证明是无法维护的。例如,如果我想在同一个脚本中有多个GET调用,我现在必须从AJAX调用向脚本传递另一个参数,以便PHP脚本知道要执行哪个查询


这两种方法中哪一种更好?有什么众所周知的实践或设计模式可以处理这个问题吗?

如果您真的想使用RESTful,请尝试使您的PHP文件结构独立于您希望AJAX请求的方式

一种常见的设计模式是为每个单独的数据实体创建一个表示,然后在该表示上定义-操作。然后,HTTP方法头充当应该执行的操作的标识符

例如,假设您有以下“数据块”:

  • 用户:您网站的成员
  • :一组成员
如果可能的话,在a中使用类似Apache的东西来创建一些漂亮的URL,如下所示:

接下来,使用AJAX将GET、PUT、DELETE或POST请求中的参数传递给这些URL之一。通常,AJAX库允许您定义GET或POST以外的操作。例如,要在jQuery中删除ID为415的名为Bob的用户,可以编写如下代码:

$.ajax({
网址:'http://example.com/api/user'
方法:“删除”,
数据:{id:415}
成功:{
//它起作用了!
}
});
下一件事是用PHP捕获数据。我建议为每个“数据块”创建一个单独的文件,但当脚本越来越大时,您可以对其进行更改。这只是一个调整HTTP服务器性能的问题

api/user.php

//确定请求了什么操作
开关($\u服务器['REQUEST\u METHOD'])
{
案例“POST”:
$data=$\u POST;
// ...
案例“GET”:
$data=$\u GET;
//例如,如果提供了ID,则获取一个用户,否则获取所有用户
如果(isset($data['id']))
获取用户($id);
其他的
获取用户();
打破
案件‘付诸表决’:
$data=parse\u str(文件获取内容php://input“),$put_vars);//见下文
// ...
案例“删除”:
$data=parse\u str(文件获取内容php://input“),$put_vars);//见下文
// ...
违约:
//405=方法不允许
http_response_code(405);//对于PHP>=5.4.0
出口
}
//用于添加、检索、删除和操作用户的函数的完整列表
函数获取用户($id)
{
$query=“从id=…”的用户中选择*;
// ...
}
函数fetch\u用户()
{
// ...
}
来源:


我建议在“restful collection”接口/抽象类上进行标准化(对于简单的情况,甚至像
ArrayAccess
这样的东西也可以),并自由使用
PATH\u INFO
。在这一点上,你可以让你所有的资源URL遵循一个标准的约定,有一个脚本来完成所有的导航/路由,并且可能对你公开的每种类型都有一个类。我很感激你提供的详细信息,但是你的回答突出了我试图避免的一些事情。将所有CRUD操作放在一个文件中已被证明是无法维护的。我还需要验证和清理传入的数据。在对所有CRUD操作执行所有这些操作之后,单个php文件开始变得杂乱无章。此外,单个CRUD操作中的分支也开始变得不可维护。正如上面所示,我可能会在同一个php文件中有多个POST请求。