如何构造响应Ajax请求的PHP服务

时间:2010-12-02 02:38:32

标签: php ajax web-services

我正在努力设计响应来自Ajax应用程序的请求的服务器端脚本。

在当前状态下,应用程序被分为不连续的页面(例如,订单,项目,财务等)。只有当您在这些页面之间切换时,才会重新加载实际网页。每个页面都有自己的“运算符”,这是所有Ajax请求所针对的根operator.php所必需的。

每个运算符中包含的是这种模式:

foreach ($actions as $action) {
    switch ($action) {
    case 'get-items':
        [...]
        break;
    case 'get-item':
        [...]
        break;
    case 'update-item':
        [...]
        break;
    [...]
    }
}

$actions由请求提供,例如operator.php?page=items&action=get-item&id=123

随着应用程序变得更加复杂,它有助于将每个操作的逻辑与请求操作的上下文分开。

我发现当我想在PHP内部使用动作逻辑时,我会经常使用这种模式:

$items = json_decode(file_get_contents('http://[...]/operator.php?action=get-items'));

(不用说,这种设计会产生很多额外的开销。)

所以我现在有一个Operator类,每个页面都会扩展。例如,我可以创建一个ItemsOperator,直接调用我想要的动作,而不需要任何编码或解码或多余的HTTP请求:

$items = $itemsOperator->getItems();

我修改了响应Ajax请求的脚本以使用Operator类,如下所示:

foreach ($actions as $action) {
    switch ($action) {
    case 'get-items':
        $json['items'] = $operator->getItems();
        break;
    [...]
    }
}

if (count($json)) {
    echo json_encode($json);
}

这种方法效果相当不错,但我从来没有接受任何正式的网络开发培训,我怀疑已经建立了更好的抽象模式(我疯狂地在谷歌上找不到)。我家酿方法的许多缺点激发了这个问题:

  1. 包含“行动”的“运营商”类的概念过于模糊且无所不包。我该如何分离逻辑?
  2. 当方法变得特别混乱时,我需要在财务页面上搜索项目数据库。我还在FinancesOperator旁边包含ItemsOperator吗? (我目前复制逻辑。)
  3. 是否有更好的方法将Ajax请求脚本与Operator对象接口(假设我不应该完全转储运算符的概念)?例如,我目前必须为每个页面编写一个脚本,将URL“action”变量映射到操作符对象的相应方法。
  4. 非常抱歉,如果这个问题太开放了。我没有让我的开发人员反复思考(就像我说的那样,我没有接受任何真正的培训) - 所以听到SO社区的建议是非常宝贵的。在设计像这样的脚本时,可能性/方法/策略的数量可能完全是压倒性的。一旦你在一个特定的方法上投入了几天时间,就很难回头。

    非常感谢您的考虑(并阅读了这篇文章)。

2 个答案:

答案 0 :(得分:1)

您似乎可以从阅读模型 - 视图 - 控制器架构模式(http://en.wikipedia.org/wiki/Model-View-Controller)中受益。

您执行此类请求的位置:

$items = json_decode(file_get_contents('http://[...]/operator.php?action=get-items'));

...您应该将逻辑封装到服务类中。因此,当您想要执行诸如“在财务页面上搜索项目数据库”之类的操作时,您可以简单地依赖封装逻辑的服务来执行此操作。

关于面向对象编程的核心原则的更多阅读将有很长的路要走以及对设计模式的简要概述。我建议您查看 Head First Design Patterns 以便于理解这些概念。

答案 1 :(得分:0)

不是完整的答案,但我会将operator.php分成两个文件。一个称为operator.php,另一个称为operator_ajax.phpoperator.php执行你现在所做的事情,但不是回应它,只需输入一个变量就可以包含它。 operator_ajax.php包含operator.php并回显值。然后,operator.php可以包含在您希望的任何其他文件中(替换HTTP请求)。