Symfony 2 — контроллер вызовов с другого контроллера

Я хотел бы использовать метод контроллера из другого пакета, в моем контроллере.

Метод this-> forward нуждается в объекте Response, и я не знаю, как его использовать.

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

И я видел, что я могу использовать сервис, но я хочу знать, является ли это лучшим решением или они другое.

4

Решение

$this->forward принимает аргументы в следующем порядке:

  1. Логическое имя действия контроллера в строковом формате, то есть ‘AcmeHelloBundle: Hello: fancy’
  2. Параметры для передачи в виде переменных запроса в формате массива, т.е. массива (
    ‘name’ => $ name,
    ‘color’ => ‘green’,
    )

Эти параметры могут быть доступны в контроллере с помощью функций доступа к запросу.

6

Другие решения

Иногда вы хотите полностью обойти защиту и запустить команду на другом контроллере, несмотря на уровень разрешений пользователя. К счастью, вы можете сделать это довольно легко.

Сначала запустите команду use для вашего контроллера в верхней части контроллера, с которого вы хотите использовать данные:

use AppBundle\Controller\MySourceDataController;

Затем вызовите эту функцию из вашего конечного контроллера:

$response = MySourceDataController::getTheData( $option1, $option2 );

Если вам нужно передать объект Request, вы можете сделать это следующим образом:

$response = MySourceDataController::getTheData( new Request( array(
'server' => 'USAServer1',
) ), $option2 );

Это возвращает Запрос с установленным параметром сервера. Я также определил $ option2, это будет переменная, часто определяемая в URL, например:

* @Route("/mydata/{server}/", name="api-source-data")
* @param Request $request
* @param         $server

Наконец, если вы передаете JSON в этот контроллер и хотите преобразовать его обратно в объект, вы можете запустить этот бит кода в $ response:

if ( 0 === strpos( $response->headers->get( 'Content-Type' ), 'application/json' ) ) {
$response = json_decode( $response->getContent(), true );
}

Вуаля. Получите доступ к любому контроллеру из любого другого контроллера и обойдите нотацию безопасности для исходного контроллера. 🙂

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector