Перенаправление на маршрут с параметрами GET

Я хотел бы маршрут, который анализирует и собирает массив GET параметры для перенаправления на другой маршрут, который ожидает GET параметры.

Я надеялся, что это сработает, где я прохожу $search_params как часть pathFor() метод:

// SEARCH VIEW
$app->get('/search', function ($request, $response, $args) {
$api = $this->APIRequest->get($request->getAttribute('path'),$request->getQueryParams());
$args['data'] = json_decode($api->getBody(), true);
return $this->view->render($response, 'search.html.twig', $args);
})->setName('search');

// ADVANCED SEARCH VIEW
$app->get('/advanced_search', function ($request, $response, $args) {
return $this->view->render($response, 'advanced_search.html.twig', $args);
});

// ADVANCED SEARCH PROCESS
$app->post('/advanced_search', function ($request, $response, $args) {

// get settings
$settings = $this->get('settings');

// get post parameters
$qp = $request->getParsedBody();

// translate advanced search form parameters to Solr-ese
$search_params = array();
$search_params['q'] = $qp['query'];

// redirect to GET:/search, with search parameters
$url = $this->router->pathFor('search', $search_params);
return $response->withStatus(302)->withHeader('Location', $url);

});

Но это не добавить массив $search_params как получить параметры. Я понимаю, что если /search Маршрут ожидал аргументов в URL с чем-то вроде {q} это будет пойман, но мне нужно добавить неизвестную группу GET параметры.

Мой обходной путь должен сделать следующее, вручную используя http_build_query() добавить GET параметры в виде строки для URL маршрута:

// SEARCH VIEW
$app->get('/search', function ($request, $response, $args) {
$api = $this->APIRequest->get($request->getAttribute('path'),$request->getQueryParams());
$args['data'] = json_decode($api->getBody(), true);
return $this->view->render($response, 'search.html.twig', $args);
})->setName('search');

// ADVANCED SEARCH VIEW
$app->get('/advanced_search', function ($request, $response, $args) {
return $this->view->render($response, 'advanced_search.html.twig', $args);
});

// ADVANCED SEARCH PROCESS
$app->post('/advanced_search', function ($request, $response, $args) {

// get settings
$settings = $this->get('settings');

// get post parameters
$qp = $request->getParsedBody();

// translate advanced search form parameters to Solr-ese
$search_params = array();
$search_params['q'] = $qp['query'];

// redirect to GET:/search, with search parameters
$url = $this->router->pathFor('search')."?".http_build_query($search_params);
return $response->withStatus(302)->withHeader('Location', $url);

});

Но это кажется неуклюжим. Я что-то упускаю из-за Slim 3 и перенаправлений?

Это связано с POST маршрут перенаправления на GET маршрут? Я пытался использовать код HTTP 307 для withStatus() в редиректе, но, как и ожидалось, это изменило запрос метода к /search, который не работает для наших целей.

1

Решение

Вы хотите добавить q-парам внутри запроса, маршрутизатор имеет 3 параметра:

  1. Название маршрута
  2. Ассоциативный массив заполнителей шаблона маршрута и значений замещения
  3. Ассоциативный массив параметров запроса

Вы добавляете q-параметр в качестве заполнителя маршрута, который будет работать, если у вас есть что-то вроде маршрута /search/{q} поэтому для добавления его в качестве параметра запроса используйте третий параметр

$url = $this->router->pathFor('search', [], $search_params);
4

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

Других решений пока нет …

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