【问题标题】:How to use a php code both for ajax and http requests?如何将 php 代码用于 ajax 和 http 请求?
【发布时间】:2015-12-12 22:23:47
【问题描述】:

我有一些包含一些 php 代码的类和方法。现在我想将这些 PHPcode 用于 ajax 和 http 请求。怎么样?

我是否应该将所有 PHP 代码编写两次? ajax 请求一次,http 请求一次?

这是我当前的结构:

/********************************************** Search.php ****/

... // some html codes

<div id="content">

<?php

if(!empty($_SERVER["HTTP_X_REQUESTED_WITH"]) && 
   strtolower($_SERVER["HTTP_X_REQUESTED_WITH"]) === "xmlhttprequest")
{ 
  $type = true; // true means ajax request
} else {
  $type = false; // false means http request
}

  $obj = new classname;
  $results = obj->func($type);
  echo $results;

?>

</div>

... // some html codes



/********************************************** Classname.php ****/

class classname {

  public function func($type){
    $arr = ('key1'=>'some', 'kay2'=>'data');

    if ($type){
      echo json_encode($arr);
    } else {
      return $arr;
    }

  }

}

现在我想知道,这是标准吗?实际上,我也想将它用于来自移动应用程序(类似于 API)的请求。我认为上面的代码有两个问题:

  1. 会有很多 IF 语句仅用于检测请求类型(在每个方法中)
  2. 只有一个文件 (class.php) 用于 ajax 和 http 请求。当我通过例如移动设备发送 ajax 请求时,它会处理一些根本不需要的代码

嗯,有什么我需要知道的吗?

【问题讨论】:

  • 你是什么意思:“现在我想将这些 PHPcodes 用于 ajax 和 http 请求”?
  • @BobvanLuijt 我想知道,我是否应该编写两次 php 代码以将其用于 ajax 和 http 请求?或者我可以编写一次(php代码)并将其用于两个请求吗?换句话说,我的方法(问题中提到)是一种正常/标准的方式?
  • 如果您想了解我的答案的更多信息,请告诉我。

标签: php ajax


【解决方案1】:

我会首先做所有的业务逻辑,调用你的类,而不依赖于你是否在一个 ajax 调用中。当一切准备好输出时,进行切换:

Search.php:

<?php
    // first do your business logic without view dependency.
    $obj = new classname;
    $results = obj->func(); // no type is passed.

    if(!empty($_SERVER["HTTP_X_REQUESTED_WITH"]) && 
       strtolower($_SERVER["HTTP_X_REQUESTED_WITH"]) === "xmlhttprequest")
    { 
        // ajax request
        echo json_encode($results);
        exit();
    } 
    // http request
?>
... // some html codes
<div id="content">
    <?=$results?>
</div>
... // some html codes

类名.php:

<?php
class classname {
  public function func(){
    $arr = ('key1'=>'some', 'kay2'=>'data');
    return $arr;
  }
}
?>

【讨论】:

  • 只有一件事,我如何将它用作 API(例如移动应用)
  • 这是一个很大的话题。我会把你推荐给this question
【解决方案2】:

这更多是关于您的软件设计,然后是简化它。通常,您会拥有一个结构,其中包含您使用的类并为响应类型分隔 PHP 文件。

例如
你可以有这些文件:classes.php、index.php 和 ajax.php。

这些类将包含可以显示为 JSON 或 HTML 的通用类。

PS:
简化可能意味着:

/********************************************** Search.php ****/

... // some html codes

<div id="content">

<?php

  $obj = new classname;
  $results = obj->func($_SERVER["HTTP_X_REQUESTED_WITH"]);
  echo $results;

?>

</div>

... // some html codes



/********************************************** Classname.php ****/

class classname {

  public function func($type){
    $arr = ('key1'=>'some', 'kay2'=>'data');

    if(!empty($type["HTTP_X_REQUESTED_WITH"]) && 
   strtolower($type["HTTP_X_REQUESTED_WITH"]) === "xmlhttprequest"){
      echo json_encode($arr);
    } else {
      return $arr;
    }

  }

}

【讨论】:

  • 谢谢....! +1 但是您的方法不好,因为它需要大量的 IF 语句 (对于每个方法) 来检测请求的类型。
【解决方案3】:

您可以编写单个代码,并且您应该仅使用部分代码来加载 AJAX 数据。我们使用 AJAX 的主要原因是尽量减少数据传输。你不应该在 AJAX 调用中加载整个页面的 HTML,尽管它是完全有效的。

根据我的经验,我的建议是,有一个文件:

<?php
    if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
        /* special ajax here */
        die(json_encode($data));
    } else { ?>

Regular Flow of Content

<?php } ?>

【讨论】:

  • 听起来不错...,但实际上您的示例对我来说并不完全清楚..,您能否为您的示例添加一些细节?特别请声明两个单独的文件。 search.php, classname.php. 哪个类名使用自动加载器进行调用)。无论如何,请将您的方法完全应用于我的代码。 tnx +1
  • @stack 谢谢。你的代码太长了。如果我这样做的话,我只是想提供一些信息。让我根据你的代码编辑我的帖子。
  • @stack 是的,伙计……我不擅长 OOPHP……它没有在我的 PC 中执行。 :(
  • @stack 刚刚注意到。我正在尝试做类似trincot 所做的事情。那是一回事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2014-06-28
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多