如何从symfony2控制器动作返回一个数组?

时间:2014-09-23 09:06:59

标签: symfony controller response

在我的symfony2项目中,我需要在许多控制器中调用相同的动作,这个动作应该返回一个非常简单的php数组,然后由这些控制器传递给twig模板。我该怎么办?

一个实际的例子可以更好地解释我的情况。

1.shared controller

// Acme/DemoBundle/Controller/MetasController

class MetasController extends Controller {

     public function metasAction() { 

         $myArray= array();

         return $myAarray;

      }

}
  1. 页面渲染控制器

    // Acme/DemoBundle/Controller/PageController
    
    class PageController extends Controller {
    
           protected $property = "test";
    
           public function indexAction() {
    
              $metas= $this->forward('AcmeDemoBundle:Metas:metas');
    
              return $this->render('AcmeDemoBundle:Page:index.html.twig', array('property'=>property,    'metas'=>$metas));
    
           }
    
    } 
    
  2. 当我这样做时,我得到一个错误:控制器必须是给定的响应数组。

4 个答案:

答案 0 :(得分:2)

您应该创建service

// Acme/DemoBundle/Controller/MetasController
class MetasController {

     public function metasAction() { 

         $myArray= array();

         return $myAarray;

      }

}

在Acme \ DemoBundle \ Resources \ config \ services.yml

中声明为服务
  

服务:       demo.metas:           class:“Acme \ DemoBundle \ Controller \ MetasController”

然后你可以在任何其他控制器中使用它

// Acme/DemoBundle/Controller/PageController

class PageController extends Controller {

       protected $property = "test";

       public function indexAction() {

          $metas= $this->get('demo.metas')->metas();

          return $this->render('AcmeDemoBundle:Page:index.html.twig', array('property'=>property,    'metas'=>$metas));

       }

} 

答案 1 :(得分:1)

在你的动作控制器中:

<?php

...

$arrayExample = array();

return $this->render('ExampleBundle:ExampleFolder:exampleTemplate', array('myArray' => $arrayExample));

现在,您可以使用myArray

访问您的数据模板

示例:

{% for data in myArray %}
    ...
{% endfor %}

答案 2 :(得分:0)

试试这个:

use Symfony\Component\HttpFoundation\Response;

public function indexAction() 
{
      ...

      $content = $this->renderView(
         'AcmeDemoBundle:Page:index.html.twig',
          array('property'=> $property,    
                'metas'   => $metas
          ));

      return new Response($content);
}

答案 3 :(得分:0)

是的,您可以将控制器注册为上述服务,但我建议将此逻辑隔离在不同的位置。它可能是服务而不是控制器。

据我所知,你需要在几个地方使用相同的数组。因此,它可能是一些注册为服务的类或一些提供此数组的静态方法的简单类。在这种情况下,您的代码将更加清晰。

如果只在视图中需要此数组,则可以定义自定义twig方法,该方法将返回所需的数组。如果此数组可能不时(如果它可能取决于某些数据),您可以将实体管理器传递给提供此数组或twig扩展的服务。

(控制器的最佳用途只是视图和数据层之间的代理。将它用于您描述的目的(当然我认为)并不是一个好主意。)