Slim 3 – Redirecionar para rotear com parâmetros GET

Eu devo estar fazendo algo errado.

Eu gostaria de uma rota que analisa e reúne uma série de parâmetros GET para redirect para outra rota que espera os parâmetros GET .

Eu esperava que isso funcionasse, onde eu passe $search_params como parte do método 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); }); 

Mas isso não acrescentou a matriz $search_params como parâmetros GET. Eu entendo que se a rota /search tivesse esperado argumentos no URL com algo como {q} seria pego, mas eu preciso append um grupo desconhecido de parâmetros GET .

Minha solução alternativa é fazer o seguinte, usando manualmente http_build_query() para append os parâmetros GET como uma seqüência de caracteres para o URL da rota:

 // 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); }); 

Mas isso parece fraco. Estou faltando alguma coisa sobre o Slim 3 e redireciona?

Está relacionado a uma rota POST redirecionando para uma rota GET ? Eu tentei usar o código HTTP 307 para o withStatus() no redirecionamento, mas como algo esperado, isso mudou o pedido de método para /search , o que não funciona para nossos propósitos.

Obrigado.

Você deseja adicionar o q -param dentro da consulta, o roteador possui 3 parâmetros:

  1. O nome da rota
  2. Arranjo associativo de espaços reservados e valores de substituição do padrão de rota
  3. Conjunto associativo de parâmetros de consulta

Você está adicionando o seu q -parameter como espaço reservado da rota, isso funcionaria se você tiver algo como isto como route /search/{q} então, para adicioná-lo como parâmetro de consulta, use o 3º parâmetro

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