2013-04-05 144 views
30

我需要从另一个控制器内的不同控制器访问方法。我该怎么做?我可以使用this->get方法吗?如何从控制器内部访问不同的控制器Symfony2

我可以在我的当前控制器中包含控制器并创建它的对象并通过该对象访问该方法吗?这样做是“好”吗?

我想调用其他控制器的窗体方法--- newAction。

+0

我认为你不应该这样做,如果你正在关注MVC,你应该将taht函数提取到Model或Helper对象中。 – zad 2013-04-05 06:37:26

+0

你能演示怎么做MVC方式吗 – chirag7jain 2013-04-05 06:38:52

+0

你想用这个控制器做什么? – 2013-04-05 06:49:08

回答

34

您可以将您的控制器定义为服务,然后将其置于另一个控制器中。

在你services.yml定义所需控制器作为服务:

services: 
    your_service_name: 
     class: YourCompany\YourBundle\Controller\YourController 

然后在任何控制器,你就可以通过容器得到这个服务:

$yourController = $this->get('your_service_name'); 

有一些有关Controllers as Services的说明文档

+3

这是最好的方式来做到这一点,或者有另一种方法来做到这一点 – chirag7jain 2013-04-05 06:47:09

+0

@CJ好吧,正如它在评论中提到的那样,你不应该在另一个控制器中调用控制器动作,但是从Symfony2 POV - 将控制器定义为服务是好的 – 2013-04-05 06:59:41

+0

非常感谢,我只是想确保我遵循最好的parctice – chirag7jain 2013-04-05 07:06:42

56

如果你不想将该类定义为一个服务,因为它不觉得作为一个很好的做法,我和@Qoop引述Fabien saying the same,您可以使用转发:

http://symfony.com/doc/current/controller/forwarding.html

public function indexAction($name) 
{ 
    $response = $this->forward('AcmeHelloBundle:Hello:fancy', array(
     'name' => $name, 
     'color' => 'green', 
    )); 

    // ... further modify the response or return it directly 

    return $response; 
} 

如果您需要将内部控制器的输出嵌入到模板中,则documentation for Symfony也有相应的功能。

+0

这是错误的,因为它会使用模板的花式行动,而不是与indexAction相关联的模板生成响应 – gondo 2014-01-30 17:24:16

+1

@gondo,你的意思是,如果你使用注解模板? YEPP。那就对了。然后你会得到生成的模板 - 所以响应会被发回。如果您想在使用注释之前获取数据,则必须将该类定义为服务。 – SimonSimCity 2014-01-30 21:24:10

+0

当涉及到单元测试时,我发现有关“转发”的更大问题。当您将控制器定义为服务时,您将无法嘲笑子请求,您可以轻松地嘲笑它。 – user3746259 2016-02-23 00:07:24