草庐IT

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

coder 2024-05-01 原文

我正在编写一个丰富的 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/

有关用于处理 AJAX 请求的 PHP OOP 模式的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  5. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  6. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  7. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  8. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  9. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  10. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

随机推荐