2017-01-17 5 views
0

Должно быть, я делаю что-то неправильно.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, который не работает для наших целей.

Спасибо.

ответ

3

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

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

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

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

Пригвожден. Я не думал о pathFor(), указывающем на маршрут «объект», с этими тремя параметрами. Я думал, что он просто использует этот «поиск», чтобы получить базовый путь и соответствовать этому пути. Но это имеет смысл, и на самом деле приятно, что вы * можете * передать объект ответа тоже. Бесконечно благодарен! – ghukill

 Смежные вопросы

  • Нет связанных вопросов^_^