这似乎是一个简单的例子,但我被卡住了。我正在观看一个教程,我们看到一个联系表单,它有自己的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
]
]);
这就是诀窍。
答案 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);
});