Я хотел бы маршрут, который анализирует и собирает массив 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
, который не работает для наших целей.
Вы хотите добавить q
-парам внутри запроса, маршрутизатор имеет 3 параметра:
Вы добавляете q
-параметр в качестве заполнителя маршрута, который будет работать, если у вас есть что-то вроде маршрута /search/{q}
поэтому для добавления его в качестве параметра запроса используйте третий параметр
$url = $this->router->pathFor('search', [], $search_params);
Других решений пока нет …