猿问

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

我有一个两步验证表单,这意味着第一个用户输入得到验证(在 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 (如果它不为空)。这有效,但我仍然不知道如何从第一页获取输入数据。


我也有这个中间件 $locale


public function handle($request, Closure $next)

{

   $locale = $request->segment(1);

   app()->setLocale($locale);

   return $next($request);

}

这似乎不会让我有时重定向,我真的不明白


叮当猫咪
浏览 123回答 2
2回答

Cats萌萌

据我了解,问题在于,在第一次 POST 之后,您登陆了一个验证可能失败的新页面,如果失败,它会重定向回自身(重新加载)——这将失败,因为第一步中的 POSTed 数据现在失踪了。这是一个常见的场景,标准的解决方案是使用PRG - Post/Redirect/Get。这意味着,在成功处理一个P OST,你的代码- [R edirects(与摹ET请求)到一个新的页面,而不是仅仅返回该页面的内容。这样,如果用户在新页面上点击重新加载 - 或者如果该新页面上的验证失败 - 它只会重新加载(使用 GET)该新页面,而无需重新提交 POST。在您的情况下,这看起来像(我使用了简化的 URI 来保持简单,并且我可能混淆了您的控制器方法):// GET the first page where user enters inputRoute::get('/first-page-form', 'TicketController@showFirstPage');// Handle that data being POSTedRoute::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 inputRoute::get('/next-page-form', 'TicketController@showNextPage');// And handle the next data being POSTedRoute::post('/next-page-processing', 'DatenTicketController@store');如果验证失败,它将简单地使用 GET 重定向回/next-page-form.

小怪兽爱吃肉

您可以使用 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 databasereturn response()->json(['success'=>'Record is successfully added']);你可以从这里的官方文档中阅读关于它的手动创建验证器
随时随地看视频慕课网APP
我要回答