Slim框架3:如何从get路由中的post路由重定向获取参数

时间:2018-03-11 00:06:00

标签: slim

这似乎是一个简单的例子,但我被卡住了。我正在观看一个教程,我们看到一个联系表单,它有自己的get路由来呈现包含已经说过的联系表单的视图。

$app->get('/contact',function (Request $request, Response $response){
    return $this->view->render($response,'contact.twig');
})->setName('contact');

然后我们有一个帖子通过该表单获取发布的数据(注意我传递的是从表单中收集的数据)。

$app->post('/contact',function ($request,$response){
    $data = $request->getParams();
    //var_dump($data);

    return $response->withRedirect($this->router->pathFor('contact.confirmed', ['data' => $data]));//https://github.com/slimphp/Slim/issues/1933

})->setName('contact');

最后,我们有另一条获取路线来呈现确认视图,让用户知道信息已成功提交。

$app->get('/contact/confirmed',function(Request $request, Response $response, $data){

    echo 'params are';
    var_dump($data);//They never show! :(

    return $this->view->render($response,'contact_confirm.twig',[
        'data'  =>  $request->getParams(),
    ]);//https://github.com/slimphp/Slim/issues/1579
})->setName('contact.confirmed');

在该确认视图中,我想检索在后期路线中提交的数据,只是为了通过他们的名字来呼叫用户,但我收到一条错误消息,指出$data为空。

我一直在努力寻找如何检索用户的名字。

作为一种解决方法,我通过从后期路线渲染视图来解决它......

$app->post('/contact',function ($request,$response){
    $data = $request->getParams();
    //var_dump($data);

    return $response->withRedirect($this->router->pathFor('contact.confirmed', ['data' => $data]));//https://github.com/slimphp/Slim/issues/1933

})->setName('contact');

然后我想知道为什么要使用withRedirect()功能呢?

我的问题是,如何使用withRedirect()函数将数据或参数从后期路由传递到get路由?在get路径中,如何检索这些参数?所以我可以将它们传递给相应的视图。

解决

感谢jmattheis这就是我解决问题的方法:

我刚刚学会了如何在slim framework 3中使用控制器,所以ContactController.php看起来像:

<?php

namespace App\Controllers\contact;

use App\Controllers\Controller;

class ContactController extends Controller
{
    public function show($request,$response)
    {
        return $this->c->view->render($response,'contact.twig');
    }

    public function store($request,$response)
    {
        echo 'storing comments in db ...';
        $data = $request->getParams();
        //var_dump($data);
        //echo 'Name is: '.$data['name'];
        $this->c->flash->addMessage('data', $data);
        return $response->withRedirect($this->c->router->pathFor('contact.success'));
    }

    public function success($request,$response,$data)
    {
        //echo 'Data to be sent in the redirect: ';
        $data = $this->c->flash->getFirstMessage('data');
        //var_dump($data);
        //die();
        return $this->c->view->render($response,'contact_success.twig',compact('data'));
    }
}

我添加了以下代码

session_start();
ini_set('date.timezone', 'America/Mexico_City');

之前

$app = new App([
    'settings'  =>  [
        'displayErrorDetails'   =>  true
    ]
]);

这就是诀窍。

2 个答案:

答案 0 :(得分:2)

您无法通过重定向传输数据。路由器上pathFor方法的第二个参数是命名参数的数组。那将是f.ex.在id路线中/user/{id},您必须将['id' => 1]放入其中。

如果$data有一个简单的结构,那么你可以将它们放在第三个参数中,这些参数是查询参数,然后用$request->getQueryParams()

读出来
$this->router->pathFor('contact.confirmed', [], $data);

或者,您可以将数据放在会话变量中,slimphp/Slim-Flash是一个库。

示例:

$app->post('/contact',function ($request,$response){
    $data = $request->getParams();
    $this->flash->addMessage('data', $data);
    return $response->withRedirect($this->router->pathFor('contact.confirmed'));
})->setName('contact');

$app->get('/contact/confirmed',function(Request $request, Response $response, $data){
    $data = $this->flash->getFirstMessage('data');
    // ...
});

答案 1 :(得分:0)

假设仅在处理表单后呈现确认模板,则无需为此类视图声明单独的GET路由。

因此,请保留呈现表单的路线:

// This route renders the contact form.
$app->get('/contact', function ($request, $response) {

    return $this->view->render($response, 'contact.twig');

})->setName('contact');

仅作为发布表单的结果呈现contact_confirm.twig

// This route is contact form processor.
$app->post('/contact', function ($request, $response) {

    // Get submitted data.
    $formData = $request->getParams();

    // Process form data, e.g. store it, sending it somewhere...

    // Render confirmation template, passing user name as template parameter.
    $templateParams = [
        'userName' => $formData['userName'] ?? 'Name unknown';
    ];

    return $this->view->render($response, 'contact_confirmed.twig', $templateParams);

});