Каков наилучший способ получить объект "Запрос" в контроллере?

Я видел, что объект запроса передается методу действия контроллера как параметр, подобный этому:

public function addAddressAction(Request $request)
{
    ...
}

Я также видел его в методе действия, где он получен из контейнера:

public function addAddressAction()
{
    $request  = $this->getRequest();
    ...
}

Какой из них лучше? Это имеет значение?

Ответы

Ответ 1

Если вы более подробно рассмотрите код базового контроллера Symfony2, вы можете заметить, что getRequest() отмечен как устаревший с версии 2.4 и будет удален в версии 3.0.

/*
 * ...
 * @deprecated Deprecated since version 2.4, to be removed in 3.0. Ask
 *             Symfony to inject the Request object into your controller
 *             method instead by type hinting it in the method signature.
 */
public function getRequest()
{
    return $this->container->get('request_stack')->getCurrentRequest();
}

Введенная следующей эволюцией,

И здесь обновление с 2.x до 3.0 документации.

Заключение

Ваш запрос должен быть частью вашей сигнатуры действия.

Ответ 2

Насколько я знаю, нет никакой разницы. Он не прерывает, так сильно влияют. Даже если вы хотите указать требуемые параметры в своем действии. Например.

/**
 * @Route("/edit/{id}", name="edit")
 */
public function editAction(Request $request, $id)
{
    // Both $request and $id are available
}