我有一个典型的网站设置,我使用AJAX与PHP脚本进行通信,然后PHP脚本读取数据并将数据写入MySQL数据库。在我以前的项目中,我需要做的PHP脚本量很小,因为我需要读取或写入的数据没有太多变化。这个站点有点不同,我为每个AJAX调用创建不同的PHP脚本的常规方法导致了大量的PHP脚本。
我决定采用不同的方法,并在同一个PHP脚本中对类似的查询进行分组。例如,如果我有以下呼叫:
getGroupById
getAllGroups
createNewGroup
在我以前的方法中,我会有三个单独的php文件,但现在我有一个可以完成所有这三个文件。
随着项目的增长,我采取的第二种方法被证明是不可维护的。例如,如果我想在同一个脚本中有多个GET调用,我现在必须将另一个参数从AJAX调用传递给脚本,以便PHP脚本知道要执行哪个查询。
这两种方法中的哪一种会更好?是否有任何众所周知的做法或设计模式来处理这个问题?
答案 0 :(得分:1)
如果您真的想要RESTful,请尝试使您的PHP文件结构独立于您希望AJAX请求的方式。
一种常见的设计模式是为您拥有的每个单独的数据实体进行表示,然后在该表示上定义CRUD - 操作。然后,HTTP方法标头用作应执行操作的标识符。
例如,假设您有以下"件"数据:
如果可能,请在mod_rewrite中使用类似Apache的.htaccess之类的内容来创建一些外观漂亮的网址:
接下来,使用AJAX将参数传递到 GET , PUT , DELETE 或 POST 请求中这些网址。通常,AJAX库允许您定义 GET 或 POST 以外的操作。例如,要在jQuery中删除ID为 415 的名为 Bob 的用户,您可以编写如下内容:
$.ajax ({
url: 'http://example.com/api/user'
method: 'DELETE',
data: { id: 415 }
success: {
// it works!
}
});
接下来就是用PHP捕获数据。我建议为每个" piece"创建一个单独的文件。数据但您可以在脚本变大时更改此数据。只需调整HTTP服务器的rewrite rules即可。
<强> API / user.php的强>
// determine what operation was requested
switch ($_SERVER['REQUEST_METHOD'])
{
case 'POST':
$data = $_POST;
// ...
case 'GET':
$data = $_GET;
// e.g. if an ID was provided, fetch one user, else fetch all of the users
if (isset ($data ['id']))
fetch_user ($id);
else
fetch_users ();
break;
case 'PUT':
$data = parse_str (file_get_contents('php://input'), $put_vars); // see below
// ...
case 'DELETE':
$data = parse_str (file_get_contents('php://input'), $put_vars); // see below
// ...
default:
// 405 = Method Not Allowed
http_response_code(405); // for PHP >= 5.4.0
exit;
}
// a whole list of functions to add, retrieve, delete and manipulate users
function fetch_user ($id)
{
$query = "SELECT * FROM users WHERE id = ...";
// ...
}
function fetch_users ()
{
// ...
}
<强>来源:强>