3

我正在编写一个丰富的 JS 应用程序,我想就如何构建 JS/PHP 提出广泛的建议。我不知道如何分解这个问题,如果它问的东西太多,对不起。我正在遭受信息过载的痛苦!

我希望 JS 会从单个 PHP 文件中请求 JSON 对象。我想要一个最小但有效的 PHP 模式来响应简洁有效的请求。也许 JS 会调用类似模型的对象来查询数据库并将 JSON 返回给客户端。

什么是 PHP 方面的好模式?我将一个 PHP 文件拼凑在一起,该文件杂乱地包含一个大型 switch 语句,用于解析来自客户端的指令以及相关数据。一个请求可能包含多个指令。例如,javascript 发送一个请求:

$.ajax({
    url: '/ajax.php', dataType: 'json',
    data: {instructions: [{
        instruction: "newPerson",
        data: {
             name: person.name,
             email: person.email
             city: person.city
        }
    }]},
    success: callback, error: ajaxFail
});

回调将是一个全局处理程序,处理 PHP 从该请求或其他请求返回的任何对象。例如,上面可能会收到一个带有由 PHP 生成的人员 ID 插入数据库的新人员对象,以及一个带有其 ID 的城市对象。其他请求也可能返回这些对象,所以单个处理程序有意义吗?(一个问题是 javascript 如何将返回的对象与提交的插入相关联)

我对我的 PHP 页面代码感到羞愧,但它看起来像这样:

$return = array();
$instructions = $_REQUEST['instructions'];
foreach ($instructions as $instruction){
    switch($instruction['instruction']){
        case 'findPoeple':
            $data = $instruction['data'];
            $res = DB::query("select player from person where player like '%". DB::esc($str) ."%'");
            $return['players'] = array();
            while ($row = DB::fetch($res)){
                $return['players'][] = $row['player'];
            }
        break;
        case 'loadAllPeople':
            // similar code
        break;
        case 'newPerson':
            // similar code
        break;
        default:
            die("command '$command' not recognised");
        break;
    }
}
echo json_encode($return);

显然,这有太多错误,无法说出要更改的内容!但我已经相当清楚我要寻找的最终结果是什么。谁能指出我简洁的模式,专门展示这种使用 OOP 以一种可敬的方式实现的 JS/PHP 方法?

MVC 对我来说是有意义的,直到丰富的 JS 应用程序成为可能,边界似乎非常模糊,任何启示都是上帝赐予的,我现在从头开始。

谢谢!

4

1 回答 1

5

tl;dr:PHP 响应简洁有效的请求的最小但有效的模式是为每种类型的请求使用单独的 PHP 脚本

与其尝试在 PHP 中路由请求,不如让 Web 服务器自动处理路由可能更简单、更容易且性能更高。您所要做的就是将case您的switch块中的每个分隔成自己的脚本,如下所示:

/findpeople.php
/loadallpeople.php
/newperson.php

这样,当您收到对“newperson.php”的请求时,您明确地知道需要哪些参数(1)、如何验证每个参数(2) 以及客户端期望返回的资源类型(3)。

例如:

  1. 'newperson.php' 可能需要一个name,emailcity来创建一个新人
  2. Aname可能是一个字符串(从 3 到 16 个字符或其他任意范围);email地址基本上是一个字符串,但在正确验证时有一些复杂的东西,并且 a可能city是一个具有与 a 类似的约束的字符串name
  3. 如果客户端试图创建一个新的person,他们可能想知道请求是否成功,以及新person的识别特征(person_id也许是你数据库中的一个值?)

最后,如果您想在 Javascript 中对多个请求进行分组,最简单的方法可能就是执行多个单独的 AJAX 请求,每条指令一个。


如果您想更上一层楼,请对 REST-ful Web 服务进行一些研究,然后重新考虑如何公开资源(在本例中是您的person对象集合)。围绕对象的(更多)REST-ful 架构person可能看起来像这样,而不是:

POST /person/ - 创建一个新人
POST /person/ person_id- 修改一个人
GET /person/ person_id- 检索有关个人的信息
GET /person/ - 检索所有人员

您可以通过变量访问 PHP 中的 HTTP 请求方法,$_SERVER['request_method']然后采取相应措施。

有关 REST 原则和实现的一些基本信息:

  • 我如何向妻子解释 REST
  • (抱歉,我会提供 Wikipedia 和 Roy Fielding 的论文的链接,其中他“发明”了 REST,但没有所需的声誉)
于 2012-10-18T04:54:31.123 回答