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

时间:2012-10-18 03:00:08

标签: 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);

显然,要说明要改变的内容有太多错误!但我已经相当清楚我正在寻找的最终结果是什么。任何人都可以指出我简明的模式,专门演示JS / PHP的这种方法,使用OOP以一种可敬的方式实现这一点吗?

MVC对我有意义,直到丰富的JS应用程序成为可能,边界看起来非常模糊,任何启示都是神派,我现在从头开始。

谢谢!

1 个答案:

答案 0 :(得分:5)

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

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

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

这样,当你收到'newperson.php'的请求时,你明确知道需要什么参数(1),如何验证每个参数(2)以及客户期望的资源类型(3) )。

例如:

  1. 'newperson.php'可能需要nameemailcity才能创建新人
  2. name可能是一个字符串(从3到16个字符或其他任意范围); email地址基本上是一个字符串,但在正确验证方面有一些很好的东西,而city可能是一个与name
  3. 具有类似约束的字符串
  4. 如果客户端正在尝试创建新的person,他们可能想知道请求是否成功,以及新的person的识别功能(person_id您的数据库中的值,也许?)
  5. 最后,如果你想在Javascript中对多个请求进行分组,最简单的方法可能只是执行多个单独的AJAX请求,每个指令一个。


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

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

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

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

    • How I Explained REST To My Wife
    • (对不起,我会提供维基百科的链接和Roy Fielding的论文,其中'发明'REST,但没有必要的声誉)