laravel表单返回到相同的页面
laravel表单返回到相同的页面
我对Laravel变得越来越自信,但是这个问题让我困惑。我已经成功创建了许多验证并保存数据的表单,然后转到新页面,但是这个表单只是刷新页面,我看不出原因在哪里。\n我希望仪表板页面要求用户输入日期,然后在预订索引页面中显示该日期的可用预订。\ndashboard.blade.php包括:\n
\nBooking Controller包括:\n
validate([ 'date' => 'required|date|after:yesterday', ]); redirect(route('bookings.index', [ 'fields' => Field::get(), 'timeslots' => Timeslot::get(), 'date' => $request->date, ])); } }
\nweb.php包括:\n
Route::get('/dashboard', function () { return view('dashboard', [ 'fields' => Field::get(), 'timeslots' => Timeslot::get(), 'bookings' => auth()->user()->bookings(), ]); })->middleware(['auth', 'verified'])->name('dashboard'); Route::resource('bookings', BookingController::class) ->only(['index', 'store', 'edit', 'update', 'destroy']) ->middleware(['auth', 'verified']);
\n当我输入日期并点击“查找可用场地”按钮时,我期望被发送到bookings/index页面,但实际上是仪表板页面刷新。我在上面的代码中找不到任何可能导致这种情况的原因,所以我想知道是否需要在其他地方查找。非常感谢您的指导。\n编辑:\n由于提交请求从未到达bookings/index页面,我在此处包含表单的实际源代码。再次,我认为它看起来很好,所以我不知道为什么控制器代码不会触发。\n
问题出现的原因是重定向语法错误,同时需要传递一个"return"关键字。要重定向到一个命名路由,不能将其作为参数传递给"redirect()"辅助函数。而应该按照下面的方式进行操作:
return redirect()->route('my.route');
或者简单地使用to_route('my.route');
您还可以将变量作为这些辅助函数的第二个参数传递。
因此,更改您的booking controller代码如下:
validate([ 'date' => 'required|date|after:yesterday', ]); return redirect()->route('bookings.index', [ 'fields' => Field::get(), 'timeslots' => Timeslot::get(), 'date' => $request->date, ]); } }
更多信息,请参阅文档
经过进一步讨论和研究,主要问题是表单被设置为“POST”,而索引页需要“GET”方法。请查看此答案。
您对我的拼写错误是正确的,但不幸的是,那不是主要问题。我认为页面从未到达BookingController的index函数。如果我在函数顶部执行dd('Booking.index')并直接导航到页面,它会显示dd内容。当我从Dashboard提交表单时,它只是重新加载相同的页面。
为了确保,我现在已经研究了laravel日志,并添加了一个调试日志,如果我直接到达页面,它会显示,但如果我尝试从Dashboard提交表单,它不会显示。
从您的代码中,表单数据提交到由您的控制器index函数处理的route('bookings.index'),然后重定向到相同的route('bookings.index')并传递一些数据。因此,您的所有代码在表单提交后只是重新加载相同的页面并传递一些数据。
但是,bookings.index页面从未加载。它总是返回到dashboard.index。
这是非常奇怪的行为。
我认为我处理dashboard的方式可能有问题,因为之前从未遇到过问题。感谢您的帮助和快速回复。我还在努力解决这个问题。
我已经更新了帖子中的web.php,以防引发其他问题。
错误不可能来自您的dashboard路由,因为dashboard页面加载正常。我认为问题来自index控制器中的输入验证。如果验证失败,laravel将重定向回上一页并显示错误消息。请尝试在dashboard blade文件中使用以下代码,并告诉我您看到了什么:
@if ($errors->any()) @foreach ($errors->all() as $error) {{ $error }} @endforeach @endif
现在很有趣。是的,我从booking.store方法中的验证中获得了错误。为什么会转到“store”?
也许是因为资源路由。我对Route::resource()不太熟悉。也许您可以只定义一个路由组。
我刚读了文档。对于路由资源,如果是POST请求/bookings,则请求将发送到store()控制器函数。如果是GET请求,那只有在发送到index()控制器函数时才会执行。请查看此答案。
就是这样。我收到了很多错误消息告诉我必须使用POST,而不是GET(即使我一直在使用POST),奇怪的是我没有收到相反的消息。我通常避免GET,并认为它会尝试在URI中包含类,但显然不是这样。现在一切都好了。感谢您的帮助。我会编辑您的原始回答并接受它。
好的。很高兴能帮到您 🙂