POST Slim Route无效

时间:2016-01-09 21:22:20

标签: javascript php ajax slim

我使用Slim进行开发。我所有的GET路线都运行得很好,但每当我使用POST时,我都会得到意想不到的结果"。请看看我是如何实施苗条的,以及"意外错误"。

  

index-routes.php(索引根文件)

<?php
require 'Slim/Slim.php';
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim(array(
'debug' => true
));
require_once 'site-index.php';
require_once 'routes/default-routes.php';
$app->contentType('application/json');
$app->run();
?>
  

路由/默认-routes.php文件

<?php
$app->post('/login',function(){
    echo 'AllHailSuccess!';
    })
?>
  

通过AJAX调用的POST请求的来源

function try1()
{
    var value1 = "afsfesa";
    API.call('/login','text','POST',function(data){console.log(data)},{var1:value1});
}
  

AJAX Call API

var API = {
  call:function(url,returnType,reqType,callback,data){
    var data = (!!data) ? data : {};
    var callback = (!!callback) ? callback : function(){};
    $.ajax({
      dataType: returnType,
      type:reqType,
      crossDomain: true,
      xhrFields: { withCredentials: true }, 
      url: url,
      data:data,
      success:callback,
      error:function(data){
          console.log("Error!");
        console.log(data);
      }
    });    
  }
}

&#34;意外错误&#34;:当我执行try1()时,POST ROUTE已成功执行,但是site-index.php的内容(纯文本中的完整代码)(我在其中调用) root index-routes.php文件)也会随之记录。我之所以首先导入site-index.php,是因为它就像一个&#34;主要阶段&#34;对于我的网站。它是我想要加载的唯一页面,用户可以在其中导航。

  • 我想知道:
    1. 为什么我会得到这种类型的输出?
    2. 我的方法好吗?我认为从index-routes导入我的主阶段文件会导致这种情况。还有其他办法吗?

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

您的Slim通话将返回页面上显示的任何内容。

有几种方法可以解决这个问题:

  1. 将所有页面渲染嵌套在路线中,并且不会渲染AJAX路线的完整页面。
  2. 修改您的AJAX调用以搜索返回的DOM以查找相关信息。
  3. 在您显示的示例中,AllHailSuccess!

    中的所有内容后都会显示site-index.php

    许多人使用模板软件渲染他们的页面,然后使用服务通过模板渲染他们的页面。对于更基本的网站,我建议您创建一个简单的服务来显示内容。

    这是我在项目中使用的Viewer类的简单示例

    class Viewer {
      /**
       * Display the specified filename using the main template
       * @param   string $filepath The full path of the file to display
       */
      public function display($filepath) {
        //set a default value for $body so the template doesn't get angry when $body is not assigned.
        $body = "";
        if (file_exists($filepath)) {
          $body = get_include_contents($filepath);
        } else {
          //You want to also return a HTTP Status Code 404 here.
          $body = get_include_contents('404.html');
        }
        //render the page in the layout
        include('layout.php');
      }
    }
    
    /**
     * Gets the contents of a file and 'pre-renders' it.
     * Basically, this is an include() that saves the output to variable instead of displaying it.
     */ 
    function get_include_contents($filepath, $params = array()) {
      if (is_file($filepath)) {
        ob_start();
        include $filepath;
        $ret = ob_get_contents();
        ob_end_clean();
        return $ret;
      }
      return false;
    }
    

    您想要向用户显示页面布局的路线现在应该如下所示:

    $app->get('/', function() {
      (new Viewer())->display('home.html');
    });
    

    这绝不是一个全面的解决方案,因为它没有解决正确的HTTP状态代码,并且代码中的文件直接被引用会变得混乱,但它是一个很好的起点,它可以快速模拟这样的东西起来。

    如果你想继续这个方向,我建议你看一下Slim v2 Response Documentation并创建一个构造并返回Response对象的类。这将为您提供更多的灵活性和功能来设置HTTP状态代码和HTTP返回标头。

    我强烈建议您查看Slim v3 Responses,因为Slim 3使用的PSR-7响应对象是多个框架的标准对象。