如何在更新后正确地转发到另一个视图

3
我在我的网站应用程序中有很多表单。然而,我注意到一旦我完成了提交并将用户转到新页面后,URL 仍然是更新前的 URL。因此,如果用户刷新页面,它会重新提交请求。
以下是我处理转发的方式。
public function update(Request $request, Wedding $wedding, User $user)
{
    $user->attending = ($request->attending != null);
    $user->save();

    $message = "Sorry to hear you won't make it!";

    if ($user->attending) {
        $message = 'Welcome to the party pal!';
    }

    return view('pages.guest.rsvp')
        ->with(compact('wedding'))
        ->with(compact('user'))
        ->with('success', $message);
}

"return view..."执行后,用户会被重定向到指定的视图,这很好,但这也允许他们刷新页面并重新提交相同的帖子。

我已经使用以下代码作为一种替代测试方法。

return redirect('/{$wedding->id}/rsvp')
    ->with(compact('wedding'))
    ->with(compact('user'))
    ->with('success', $message);

然而,这似乎无法传递变量(例如“成功”消息)。此外,这需要我每次手动键入包含所有URL参数的URL,而只需告诉它使用哪个视图似乎更清晰。


更新:针对Максим Степанов的回应,我已经更新了我的路由:

Route::get('rsvp', 'Guest\MenuController@index')->name('rsvp');

虽然之前的方法可行(感谢您),但现在我正在这样重定向:

return redirect()
        ->route('rsvp', ['wedding' => $wedding])
        ->with('success', $message);

虽然重定向功能可用,但成功消息似乎不起作用。通过以下方式捕获消息:

@if (isset($success))
    <div class="alert alert-success">
        {{$success}}
    </div>
@endif

我搜索了关于为什么在“->with(...”中的项目没有通过重定向的指导,但我找不到任何人遇到这个问题 - 我认为这是我做的某些事情。我只是想不出是什么。


您可以直接刷新变量。 - Vinay
3个回答

1
您无法通过使用with方法传递变量的方式来访问它们的原因是,with方法会将数据闪存到会话中,而不是直接传递给视图。请参见以下引用。

https://laravel.com/docs/5.8/redirects#redirecting-with-flashed-session-data

为了访问视图中的变量,您可以从会话数据中提取成功消息。
@if (session('success'))
    <div class="alert alert-success">
        {{ session('success')}}
    </div>
@endif

1

只需使用 route 帮助程序和 redirect 帮助程序指定您要转到的路由名称:

return redirect()->route('your.route.name')->with([...]);

注意:这需要你命名路由,例如

Route::get('/test', 'SomeController@index')->name('your.route.name');

或者您可以直接将URL传递给redirect。当您单独调用view时,虽然它会加载实际的view,但是由于控制器与请求而非实际视图绑定,因此不会触发相应的控制器。

with助手函数创建了一个flash session项,因此,在您的blade文件中,您需要通过session助手函数访问它,而不是作为直接变量:

@if (session('success'))
    <div class="alert alert-success">
        {{ session('success') }}
    </div>
@endif

0

路由:

Route::get('/{$wedding}/rsvp', 'UpdateController@update')->name('wedding');

控制器:

return redirect()->route('wedding', ['id' => $wedding->id])->with('success', $message);

或者

return redirect()->action(
    'UpdateController@update', ['wedding' => $wedding]
)->with('success', $message);

谢谢您的回复,我在尝试了您的建议后更新了我的问题,似乎仍然存在成功消息传递的问题,您有什么想法吗? - MrDKOz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接