【问题标题】:How to write PHP codes usable both for http and ajax request?如何编写可用于 http 和 ajax 请求的 PHP 代码?
【发布时间】:2015-12-12 13:51:32
【问题描述】:

我有一些 php 代码,并且有一个声明 ajax 类型的条件。现在我想知道,我应该为每个请求分别编写所有的php代码吗?换句话说,我是否应该为这两种方法编写所有 php 代码两次(几乎重复)

if(!empty($_SERVER["HTTP_X_REQUESTED_WITH"]) && strtolower($_SERVER["HTTP_X_REQUESTED_WITH"]) === "xmlhttprequest")
{
    // I'm ajax  
    $arr = array('key1'=>'value1', 'key2'=>'value2');
    echo json_encode($arr);

} else {

    // I'm not ajax
    $arr = array('key1'=>'value1', 'key2'=>'value2');
    $_SESSION["arr"] = arr;
    header('Location: '.$_SERVER['HTTP_REFERER']); // redirect to previous page
}

所以,如您所见,我必须将所有 PHP 代码编写两次。一次用于常规请求,一次用于 ajax 请求。实际上有很多代码,可能有 1000 行代码,我有两个为 ajax 请求再次编写它们(虽然它们几乎相同)。这是正常的方式吗?

我也想知道,有没有简洁的方法?实际上,我喜欢使用一种只需为两个请求编写一次 php 代码的方法......!

【问题讨论】:

  • 不,您不必将所有代码编写两次。通常,您会从 UI 绑定功能中提取常用功能。然后,您将拥有两个不同的 UI 组件(一个用于 AJAX/API 请求,一个用于页面/UI 请求,因为将它们保持在同一页面上没有多大意义),它们将引用通用功能。
  • @David 感谢您的评论。我几乎明白你的意思。但实际上我仍然无法使用它..!有什么小例子吗?我想用它作为我的模式..
  • 另一种思考方式 - 编写函数以将数据提取到数组中。然后编写几个函数来格式化该数据 - 一个用于HTML 输出,另一个用于AJAX
  • @RyanVincent 看起来不错。请您在我的问题下写一个答案吗?

标签: php ajax performance


【解决方案1】:

我会创建一个类来处理这些请求,并将公共代码直接放入两个上下文使用的方法中:

// file: class.handler.php
class contextHandler() {
  public function handleHttp() {
    $this->handleGeneral();
    // What ever has to be done in this context
    $_SESSION["arr"] = arr;
    header('Location: '.$_SERVER['HTTP_REFERER']);
  }

  public function handleAjax() {
    $this->handleGeneral();
    // What ever has to be done in this context
    echo json_encode($arr);
  }

  private function handleGeneral() {
    // put common code here
    $arr = array('key1'=>'value1', 'key2'=>'value2');
  }
}

然后您可以在您的代码中使用该类:

include 'class.handler.php';
$handler = new contextHandler();
if(
  !empty($_SERVER["HTTP_X_REQUESTED_WITH"]) &&
  strtolower($_SERVER["HTTP_X_REQUESTED_WITH"]) === "xmlhttprequest"
)
{
  $handler->handleAjax();
} else {
  $handler->handleHttp();
}

这当然要根据您的具体需求进行调整,但它提供了一种很好且干净的方式来重用代码并生成小而易读的代码。

【讨论】:

  • 谢谢!我从你的回答中得到了一些想法。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2018-01-22
相关资源
最近更新 更多