Должно быть, я делаю что-то неправильно.Slim 3 - перенаправление на маршрут с параметрами 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
в качестве параметров GET. Я понимаю, что если бы маршрут /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
, который не работает для наших целей.
Спасибо.
Пригвожден. Я не думал о pathFor(), указывающем на маршрут «объект», с этими тремя параметрами. Я думал, что он просто использует этот «поиск», чтобы получить базовый путь и соответствовать этому пути. Но это имеет смысл, и на самом деле приятно, что вы * можете * передать объект ответа тоже. Бесконечно благодарен! – ghukill