Symfony2: Как передать параметры повторного ввода URL-адресов контроллерам?
Возможно, я что-то упустил, но, похоже, не существует способа определить параметры querystring в маршрутах в Symfony2, чтобы они могли быть переданы в контроллер.
Например, вместо генерации URI типа /blog/my-blog-post
(из Symfony2 документации по маршрутизации) и передачи его по следующему маршруту:
# app/config/routing.yml
blog_show:
pattern: /blog/{slug}
defaults: { _controller: AcmeBlogBundle:Blog:show }
Я бы предпочел создать URI, например /blog?slug=my-blog-post
. Проблема в том, что я не могу найти нигде, чтобы определить параметр slug
в файле конфигурации маршрута (например, его сопоставление {slug} выше).
Возможно, это специально, но тогда лучше всего работать с параметрами GET в querystring?
В документации упоминается их в Создание URL-адресов с помощью строк запроса, поэтому как передать их в контроллер?
Где я могу найти упоминание о них, Symfony2 и Основы HTTP:
use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals();
// retrieve GET variables
$request->query->get('foo');
Является ли это лучшей практикой для работы с ними внутри контроллера?
Ответы
Ответ 1
Чтобы работать с параметрами GET/POST в контроллере, который расширяет Symfony\Bundle\FrameworkBundle\Controller\Controller:
public function updateAction()
{
$request = $this->getRequest();
$request->query->get('myParam'); // get a $_GET parameter
$request->request->get('myParam'); // get a $_POST parameter
...
}
Для контроллера, который не расширяет базовый контроллер Symfony, объявите объект запроса как параметр метода действия и действуйте, как указано выше:
public function updateAction(Request $request)
{
$request->query->get('myParam'); // get a $_GET parameter
$request->request->get('myParam'); // get a $_POST parameter
...
}
Ответ 2
Вы не можете указать параметры строки запроса в файлах конфигурации маршрутизации.
Вы просто получаете их из объекта $request в контроллере: $request->query->get('foo');
(будет null
, если он не существует).
И для генерации маршрута с заданным параметром вы можете сделать это в своих шаблонах с твигами:
{{ path(route, query|merge({'page': 1})) }}
Если вы хотите создать маршрут в своем контроллере, это точно так же, как в документации, которую вы указали:
$router->generate('blog', array('page' => 2, 'category' => 'Symfony'));
будет генерировать маршрут /blog/2?category=Symfony
(параметры, которые не существуют в определении маршрута, будут переданы в виде строк запроса).