【问题标题】:Laravel: How to redirect to post pageLaravel:如何重定向到帖子页面
【发布时间】:2019-12-12 17:56:38
【问题描述】:

我有一个两步验证表单,这意味着第一个用户输入得到验证(在 ValidateTicketData-Controller 中),如果一切正确,您将进入下一个表单页面,我通过

Route::post('/{locale?}/ticket/{cat?}', 'TicketController@store')->name('validation');

问题:在第二页上,用户需要上传文件,否则验证失败。
如果是这种情况,验证器类会立即重定向,这不起作用,因为它是一个后路由。

所以我创建了一个这样的获取路线:

Route::get('/{locale?}/ticket/{cat?}', 'TicketController@store')->name('validation');

并将其放入store-方法中:

$ticketData = $request->validated();
if ($request->isMethod('get')) {
    $error = 'No pdf-file has been attached.';
    return view ('/validation', compact('ticketData', 'cat', 'error'));
}

我将其放入store-方法中,因为如果用户不在第二页上附加文件,这就是用户被重定向的地方。

但是,如果我现在尝试在不附加文件的情​​况下发送表单,我会收到 I've redirected too many times 的消息。

我找不到如何使用来自第一页的验证输入重定向到“验证”页面的解决方案(因为它会再次显示),因为验证类会自动执行此操作。

编辑

我将获取路线更改为:

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);
}

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

【问题讨论】:

  • store 方法用于处理表单数据并进行相应的重定向。因此,您验证失败并要处理表单,验证失败等等......
  • @ggdx 你知道如何预防/解决这个问题吗?
  • 是的。使用更合适的路线。

标签: php laravel redirect post routes


【解决方案1】:

据我了解,问题是在第一次 POST 之后,您会进入一个新页面,验证可能会失败,如果确实如此,它会重定向回自身(重新加载) - 这将失败,因为 POST 数据来自现在缺少第一步。

这是一个常见的场景,标准的解决方案是使用PRG - Post/Redirect/Get。这意味着在成功处理 POST 后,您的代码会R重定向(通过 GET 请求)到新页面,而不仅仅是返回该页面的内容。这样,如果用户在新页面上点击重新加载 - 或者如果该新页面上的验证失败 - 它只会重新加载(使用 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。

【讨论】:

  • 当我添加 `Route::get('/{locale?}/ticket/{cat?}');我收到这条路线没有动作的错误,我该怎么办?
  • @ofmiceandmoon 对不起,我的错误,我忘了包含 Controller@method。我已经更新了我的答案。它们只是普通的 GET 路由,它们需要一个 URI 和一个控制器/方法。
  • @ofmiceandmoon 这有帮助吗?
  • 我正在尝试使用您的提示,但不知何故它仍然无法正常工作。我认为我为本地化制作的中间件给我带来了一些问题
  • @ofmiceandmoon 尝试暂时评论一下,看看是否是问题所在?
【解决方案2】:

您可以简单地使用 laravel Validation Class 通过验证来处理验证响应。您可以按照以下代码进行操作。

$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']);

你可以从这里manually-creating-validators的官方文档中阅读它

【讨论】:

  • 如果我有一个 ValidateUploadedFile- 扩展 FormRequest 的类,那么我该如何以及在哪里实现呢?
  • 我没有$validator,也不知道该放在哪里
  • 您正在制作验证器,请参阅我的代码。如果你有你的验证类扩展FormRequest,那么只需添加验证,如'validation1'=> ValidateUploadedFile();
  • @KaranSadana 我想你误解了这个问题。问题是用户通过 POST 进入第二页,因此重定向不起作用。
  • @Don'tPanic 你是对的,我编辑了问题并添加了一些代码,但仍然存在无法从第一个输入中获取 ticketData 的问题
猜你喜欢
  • 2015-04-19
  • 2018-11-17
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多