2014-09-23 66 views
1

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

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

1.shared控制器

// Acme/DemoBundle/Controller/MetasController 

class MetasController extends Controller { 

    public function metasAction() { 

     $myArray= array(); 

     return $myAarray; 

     } 

} 
  • 页面呈现控制器

    // 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)); 
    
         } 
    
    } 
    
  • 当我为此我得到一个错误:控制器必须是给定的响应数组。

    +0

    别t转发它,因为第二个函数似乎不是一个实际的Controller,而只是一个返回数组的泛型类。相反,把它变成一个普通的类,然后调用这个方法。 为什么它在一个控制器中摆在首位? – Erik 2014-09-23 10:05:56

    回答

    2

    你应该在Acme的\ DemoBundle \资源创建一个service

    // Acme/DemoBundle/Controller/MetasController 
    class MetasController { 
    
        public function metasAction() { 
    
         $myArray= array(); 
    
         return $myAarray; 
    
         } 
    
    } 
    

    声明为服务\设置\ services.yml

    services: 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)); 
    
         } 
    
    } 
    
    +0

    非常感谢。这解决了我的问题! – Domenico 2014-09-23 10:24:57

    1

    在动作控制器:

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

    而在你的树枝模板现在你有机会使用myArray

    比如你的数组:

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

    感谢您的答案,但这不是我的情况。我用一些代码更新了我的问题,所以也许可以更清楚。 – Domenico 2014-09-23 09:48:11

    +0

    确定看看我的新答案请问:) – DOZ 2014-09-23 10:00:22

    +0

    我明白了,但它不起作用。我猜这个问题在第一个控制器里面。 – Domenico 2014-09-23 10:08:44

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

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

    据我所知,你需要在几个地方相同的阵列。所以,它可能是一些类注册为服务或一些简单的类与提供此数组的静态方法。在这种情况下,你的代码会更干净。

    如果你只需要在视图中使用这个数组,你可以定义自定义的分支方法,它将返回你需要的数组。如果这个数组可能会有不同的时间(如果它可能取决于某些数据),那么可以将实体管理器传递给提供此数组的服务或枝条扩展。

    (控制器的最佳方式是只是视图和数据层之间的代理。它并不像你描述的(在我的课程的意见),以将其用于这种目的的好主意。)

    相关问题