【问题标题】:How return an array from a symfony2 controller action?如何从 symfony2 控制器动作中返回一个数组?
【发布时间】:2014-09-23 09:06:58
【问题描述】:

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

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

1.共享控制器

// 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));
    
           }
    
    } 
    

当我这样做时,我得到一个错误:控制器必须是一个给定的响应数组。

【问题讨论】:

  • 不要转发它,因为第二个函数似乎不是一个实际的控制器,而只是一个返回数组的泛型类。相反,把它变成一个普通的类,然后调用这个方法。为什么它首先在控制器中?

标签: symfony controller response


【解决方案1】:

你应该创建一个service

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

     public function metasAction() { 

         $myArray= array();

         return $myAarray;

      }

}

在 Acme\DemoBundle\Resources\config\services.yml 中声明为服务

服务: 演示.metas: 类:“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));

       }

} 

【讨论】:

    【解决方案2】:

    在你的动作控制器中:

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

    现在,在您的树枝模板中,您可以使用 myArray 访问您的数组

    例子:

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

    【讨论】:

    • 感谢您的回答,但这不是我的情况。我已经用一些代码更新了我的问题,所以也许可以更清楚。
    • 我明白了,但它不起作用。我猜问题出在第一个控制器内部。
    【解决方案3】:

    试试这个:

    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);
    }
    

    【讨论】:

      【解决方案4】:

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

      据我了解,您需要在多个地方使用相同的数组。因此,它可能是一些注册为服务的类或一些具有提供此数组的静态方法的简单类。在这种情况下,您的代码会更加简洁。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-30
        • 2016-02-09
        • 1970-01-01
        相关资源
        最近更新 更多