将json返回到symfony中的ajax?

nev*_*ame 18 symfony1

在symfony中,我调用一个动作,我想让它将json返回给jQuery前端.

Jobeet教程教导如何返回部分但我想返回json,而不是部分.

Tom*_*Tom 38

如果它只是一个正常的AJAX动作你将它从中返回,我想我过去在某个地方使用了以下内容:

return $this->renderText(json_encode($something));
Run Code Online (Sandbox Code Playgroud)

  • 如果您在开发模式下激活了Web调试栏,则必须添加"sfConfig :: set('sf_web_debug',false)"行;" (8认同)
  • 这将在响应正文中返回json,但内容类型将为text/html.添加`$ this-> getResponse() - > setContentType('application/json');` (7认同)

tim*_*dev 17

便宜的方式:

function executeSomethingThatReturnsJson(){
  $M = new Model();
  $stuff = $M->getStuff();
  echo json_encode($stuff);
  die(); //don't do any view stuff
}
Run Code Online (Sandbox Code Playgroud)

更聪明的方式:

更聪明的方法是创建一个很好的sfActions子类,帮助处理json-stuff.

在我最近做的一个项目中,我创建了一个名为'api'的应用程序(./symfony generate:application api)

然后创建一个文件,如:

API/LIB/apiActions.class.php

<?PHP
class apiActions extends sfActions {
  public function returnJson($data){
    $this->data = $data;
    if (sfConfig::get('sf_environment') == 'dev' && !$this->getRequest()->isXmlHttpRequest()){
      $this->setLayout('json_debug'); 
      $this->setTemplate('json_debug','main');
    }else{
      $this->getResponse()->setHttpHeader('Content-type','application/json');
      $this->setLayout('json');
      $this->setTemplate('json','main');
    }
  } 
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在那里明确设置了模板.

所以我的jsonSuccess.php模板很简单:

<?PHP echo json_encode($data);
Run Code Online (Sandbox Code Playgroud)

虽然json_debugSuccess.php使事情更漂亮:

<?PHP var_dump($data); ?>
Run Code Online (Sandbox Code Playgroud)

然后你可以有一个控制器扩展apiActions(而不是通常的sfActions),如下所示:

<?php
class myActions extends apiAction {
  public function executeList(sfWebRequest $request)
  {
    $params = array();
    if ($request->hasParameter('id')){
      $id = $request->getParameter('id');
      if (is_numeric($id)){
        $params['id'] = $id;
      }
    }
    $data = Doctrine::getTable('SomeTable')->findAll();
    $this->returnJson($data);
  }
}
Run Code Online (Sandbox Code Playgroud)

免责声明:上面的代码是从我拥有的应用程序复制/粘贴,但简化.它仅用于说明目的 - 但它应该让您朝着正确的方向前进.

  • 对 - 其他答案是"廉价方式"的更好的版本.我的其余部分是基于环境以不同的方式处理事物,但我确信它可以做得更清洁. (6认同)