为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel:如何重定向到帖子页面

Laravel:如何重定向到帖子页面

PHP
叮当猫咪 2021-11-13 16:54:14
我有一个两步验证表单,这意味着第一个用户输入得到验证(在 ValidateTicketData-Controller 中),如果一切正确,您将进入下一个表单页面,我通过Route::post('/{locale?}/ticket/{cat?}', 'TicketController@store')->name('validation');问题:在第二个页面上,用户需要上传文件,如果他不上传,则验证失败。如果是这种情况,验证器类会立即重定向,这不起作用,因为它是后路由。所以我创建了一个这样的获取路线:Route::get('/{locale?}/ticket/{cat?}', 'TicketController@store')->name('validation');并将其放入store-method 中:$ticketData = $request->validated();if ($request->isMethod('get')) {    $error = 'No pdf-file has been attached.';    return view ('/validation', compact('ticketData', 'cat', 'error'));}我把它放到store-method 中,因为如果用户不在第二页上附加文件,这是用户被重定向的地方。但是,如果我现在尝试在不附加文件的情况下发送表单,则会收到I've redirected too many times.我找不到如何使用第一页中经过验证的输入重定向到“验证”页面的解决方案(因为它会再次显示),因为 Validation 类会自动执行此操作。编辑我将获取路线更改为:Route::get('/{locale?}/ticket/{cat?}', function() {  $error = 'no pdf tho.';  return view('/validation', compact('error'));});并在视图中显示 $error (如果它不为空)。这有效,但我仍然不知道如何从第一页获取输入数据。我也有这个中间件 $localepublic function handle($request, Closure $next){   $locale = $request->segment(1);   app()->setLocale($locale);   return $next($request);}这似乎不会让我有时重定向,我真的不明白
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

据我了解,问题在于,在第一次 POST 之后,您登陆了一个验证可能失败的新页面,如果失败,它会重定向回自身(重新加载)——这将失败,因为第一步中的 POSTed 数据现在失踪了。


这是一个常见的场景,标准的解决方案是使用PRG - Post/Redirect/Get。这意味着,在成功处理一个P OST,你的代码- [R edirects(与摹ET请求)到一个新的页面,而不是仅仅返回该页面的内容。这样,如果用户在新页面上点击重新加载 - 或者如果该新页面上的验证失败 - 它只会重新加载(使用 GET)该新页面,而无需重新提交 POST。


在您的情况下,这看起来像(我使用了简化的 URI 来保持简单,并且我可能混淆了您的控制器方法):


// GET the first page where user enters input

Route::get('/first-page-form', 'TicketController@showFirstPage');


// Handle that data being POSTed

Route::post('/first-page-processing', 'TicketController@store')->name('validation');

现在您的TicketController@store方法进行了验证,并假设一切都通过了,不只是返回一个视图,而是:


public function store(...) {

    // Validation code ...

    //

    // Assuming validation OK, save POSTed data to DB, or maybe

    // to session ...

    //

    // All done - redirect to a new page with a GET.

    return redirect('/next-page-form');

}

你需要一个 GET 路由来处理:


// GET the next page where user enters input

Route::get('/next-page-form', 'TicketController@showNextPage');


// And handle the next data being POSTed

Route::post('/next-page-processing', 'DatenTicketController@store');

如果验证失败,它将简单地使用 GET 重定向回/next-page-form.


查看完整回答
反对 回复 2021-11-13
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

您可以使用 laravel 验证类通过验证处理验证响应来简单地做到这一点。您可以按照以下代码进行操作。


$validator = \Validator::make($request->all(), [

    'validation1' => 'required',

    'validation2' => 'required',

    'validation3' => 'required',

]);


if ($validator->fails())

{

    redirect()->route('your route')->with('error',$validator->errors()->all());

    // or you can return response json for your some ajax or api calls

    return response()->json(['errors'=>$validator->errors()->all()]);

}


//do whatever on validation passes

// store data to database

return response()->json(['success'=>'Record is successfully added']);

你可以从这里的官方文档中阅读关于它的手动创建验证器


查看完整回答
反对 回复 2021-11-13
  • 2 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信