Slim框架重定向带参数

5

我第一次使用Slim框架,目前一切都很顺利。但有一件事让我感到困惑。在提交表单后,我希望能够重定向回同一页,但它在URL中使用了参数,我无法返回那一页。目前我的代码如下:

$app->post('/markets-:game', $authenticated(), function($game) use ($app) {

    $request = $app->request();

    $id = $request->post('game3');

    $app->flash('global', 'game added');
    $app->response->redirect($app->urlFor('games.markets', {"game:$id"}));

})->name('games.markets.post');

非常感激您的帮助。谢谢。


关于Slim v3.x的一个回答,提供足够详细的信息:#38939583 - MNR
3个回答

7

如果有人因为Slim 3的问题来到这里,相关信息已经在升级指南文档中有所记录。

现在,重定向到带参数的路由的方法如下:

$url = $this->router->pathFor('games.markets', ['game' => $id]);
return $response->withStatus(302)->withHeader('Location', $url);

另外,当命名路由时,您现在必须使用

$app->get('/', function (Request $request, Response $response) {...})->setName('route.name');

不再使用旧的->name

关于从Slim 2到Slim 3的差异的其他信息,请参阅Slim升级指南


重定向路由games.market需要接收参数'game'。 - Biguá
在这个例子中是的,但您可以删除数组以重定向到没有参数的路由。 - James McClelland
1
注意:如果你的路由期望 ($request, $response, $args),你可能需要在中间传递 '[]'。关于这个有用的答案:http://stackoverflow.com/a/41705732/1196358 - ghukill

6

urlFor方法接受两个参数:

  1. 路由的名称;
  2. 一个包含所有参数的关联数组(可选)。

试一下这个:

$app->response->redirect($app->urlFor('games.markets', array('game' => $id)));

6

Slim 3 解决方案

另一个关于 Slim 3 的解决方案不够优雅,同时也忽略了一个事实,即必须将空数组作为第二个参数传递以将查询参数作为第三个参数传递;如果没有这样做,则不会使用任何查询参数

因此,Slim 3 的解决方案只需如下所示。

return $response->withRedirect($this->router->pathFor('named.path.of.route', [], [
    'key1' => $value1,
    'key2' => $value2
]));

可以通过POST方法发送它吗?这样它就不会在浏览器中显示了吗? - iamafasha
1
@novapack,以你所希望的简单方式不可能实现,但这是HTTP协议的选择,而不是Slim。只有通过一个中间页面才能实现,您可以像通常一样将其重定向到(例如上面),然后进行POST请求。请参见此处的顶部答案:https://dev59.com/Im035IYBdhLWcg3wMM4G#5576700 - Alex W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接