2013-04-05 6 views
30

Мне нужно получить доступ к методу с другого контроллера внутри другого контроллера. Как мне это сделать? Могу ли я использовать метод this->get?Как получить доступ к другому контроллеру изнутри контроллера Symfony2

Могу ли я включить контроллер внутри моего текущего контроллера и сделать его объектом и получить доступ к этому методу через объект? Это нормально?

Я хочу назвать метод формы --- newAction другого контроллера.

+0

Я думаю, что вы не должны это делать, если вы следуете за MVC, вы должны извлечь функцию taht в объект Model или helper. – zad

+0

Можете ли вы показать, как это сделать MVC way – chirag7jain

+0

Что вы хотите с этим контроллером? –

ответ

34

Вы можете определить свой контроллер как услугу, а затем получить его на другом контроллере.

В вашей services.yml определить необходимый контроллер в качестве службы:

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

Тогда в любом контроллере вы будете иметь возможность получить эту услугу с помощью контейнера:

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

Существует несколько полезная информация о Controllers as Services в документации

+3

Это лучший способ сделать это. Или есть другой способ сделать это – chirag7jain

+0

@CJ Ну, как уже упоминалось в комментариях, вы не должны вызывать действие контроллера в другом контроллере. Но из Symfony2 POV - с контроллером, определенным как сервис в порядке –

+0

Большое спасибо. Я просто хотел удостовериться, что я слежу за лучшими parctice – chirag7jain

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

+1

@gondo, вы имеете в виду, если вы используете шаблоны по аннотациям? Yepp. Это верно. Затем вы получите сгенерированный шаблон - так что ответ будет отправлен обратно. Если вы хотите получить данные до использования аннотаций, вам необходимо определить класс как службу. – SimonSimCity

+0

Я вижу больше проблем, связанных с «пересылкой», когда дело доходит до модульного тестирования. Вы не сможете высмеивать подзапрос, когда вместо этого вы определяете свой контроллер как услугу, вы можете легко его издеваться. – user3746259

Смежные вопросы