用于处理 AJAX 请求的 PHP OOP 模式

标签 php javascript oop design-patterns

我正在编写一个丰富的 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 方法吗?

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

谢谢!

最佳答案

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

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

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

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

例如:

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

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


如果您想将其提升到一个新的水平,请对 REST-ful Web 服务进行一些研究,然后重新考虑您如何公开资源(在本例中为您的 person 对象的集合)。围绕 person 的(更多)REST-ful 架构对象可能看起来像这样:

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

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

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

  • How I Explained REST To My Wife
  • (抱歉,我会提供指向 Wikipedia 和 Roy Fielding 论文的链接,他在论文中“发明”了 REST,但没有所需的声誉)

关于用于处理 AJAX 请求的 PHP OOP 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12946416/

相关文章:

php - Codeigniter 配置文件,从模型加载 get 函数

php - scraper php 返回空白页

javascript - 如何防止有序列表的编号 <ol> 调整以适应隐藏/取消隐藏元素

python - 指向另一个对象的属性并添加你自己的

class - 类的所有私有(private)变量的 getter 和 setter?

javascript - 如何向 "new"实例添加属性?

php - 从安全网站获取特定数据

javascript - 使用 PHP - 是否可以在浏览器中设置 SessionStorage?

javascript - 单击复选框+按钮后动态更改 slider 值

PHP 错误处理,当错误是文本消息而不是抛出的异常时