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

时间:2013-11-23 23:20:26

标签: php ajax rest design-patterns

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

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

getGroupById
getAllGroups
createNewGroup

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

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

这两种方法中的哪一种会更好?是否有任何众所周知的做法或设计模式来处理这个问题?

1 个答案:

答案 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 ()
{
  // ...
}

<强>来源: