Подтвердить что ты не робот

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');

Является ли это лучшей практикой для работы с ними внутри контроллера?

4b9b3361

Ответ 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 (параметры, которые не существуют в определении маршрута, будут переданы в виде строк запроса).