当前位置: 首页 > 知识库问答 >
问题:

Laravel:如何重定向到post页面

左丘楷
2023-03-14

我有一个两步验证表单,这意味着第一个用户输入得到验证(在ValidatecKetData控制器中),如果一切正常,您可以进入下一个表单页面,我可以通过

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

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

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

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

并将其放入存储-方法:

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

我把它放到了store-method中,因为如果用户不在第二页附加文件,就会在这里重定向。

但是,如果我现在尝试发送表单而不附加文件,我会收到一条消息,我重定向了太多次

我找不到一个解决方案,如何重定向到验证页面与验证输入从第一页(因为它会再次显示),因为验证类自动这样做。

编辑

我将获取路径更改为:

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

它似乎不允许我改变方向,我真的不明白

共有2个答案

娄德运
2023-03-14

通过对处理验证响应进行验证,您可以简单地对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']);

您可以从官方文档中阅读它,从这里手动创建验证器

芮安顺
2023-03-14

据我所知,问题在于,在第一次发布后,您会进入一个新页面,验证可能会失败,如果验证失败,它会重定向回自身(重新加载)-这将失败,因为第一步发布的数据现在已丢失。

这是一个常见的场景,标准的解决方案是使用PRG-Post/重定向/获取。这意味着在成功处理POST后,代码将重定向(带有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');

如果验证失败,它只需使用返回/下一页表单重定向即可。

 类似资料:
  • 我和拉威尔3一起工作。我有一个动作按钮,将打开一个弹出模式。 我有一个设备列表。第一页,弹出模式在那里。但对于第二页,弹出模式不出来,但它重定向回第一页。 index.blade.php代码: {{HTML::link(“设备#openProfile”,“强制配置文件”,数组(“id”)= JS: 函数openImposeProfile(id){ document.getElementById("

  • 我在Laravel框架中的HomeController.php中有一段代码,但是我无法访问它重定向到登录页面的索引/主页。我犯了什么大错?

  • 我在Laravel5.2中使用了php artisan函数。 我想重定向的客人登录页面,若客人点击链接,只有用户并没有客人。 我想在登录后将用户重定向到后面的页面。 我怎么能这么做?请详细展示一些文件名示例。 ///////编辑 路线 控制器 Kernel.php

  • 我想在成功登录后为特定页面重定向用户。 我不希望用户在登录后导航到上次查看的页面。 我试过以下网址,但它显示我的错误。 错误:

  • 我在laravel中遇到了一个用户登录的问题,我可以正确地登录用户,但是问题是,在用户登录后,他被重定向到login POST方法,而不是home,我已经将

  • 我有一个带有登录表单的jsp页面,我使用的是servlet,如果用户名和密码正确,servlet会将用户重定向到另一个页面,否则它会再次将用户重定向到登录页面 下面是servlet