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

CL2*_*L22 3 javascript php 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
});
Run Code Online (Sandbox Code Playgroud)

回调将是一个全局处理程序,处理PHP返回的任何对象,来自此请求或其他.例如,上面的内容可能会收到一个新的person对象,其中包含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);
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

小智 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. A name可能是一个字符串(从3到16个字符或其他任意范围); 一个email地址基本上是一个字符串,但在正确验证时有一些很好的东西,而且a city可能是一个具有类似约束的字符串name
  3. 如果客户端正在尝试创建新的person,他们可能想知道请求是否成功,以及新person的标识功能(person_id可能是数据库中的值?)

最后,如果要在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原则和实现的一些基本信息: