Return 在 Laravel 5.4 中多次更新后从编辑表单返回

Return back from edit form after several updates in Laravel 5.4

我正在尝试为我的编辑表单添加功能。也许不是最佳实践,但是...

我想保留原版 url 进行多次更新。当用户第一次登陆编辑表单(从列表或单一视图)时,我想要一个取消按钮,将用户重定向回.. "referrer"。更新后,我重定向回编辑表单并显示成功消息。我想隐藏取消按钮并显示后退按钮。用户可以多次编辑。

我试图通过 Request 传递原始 url,但结果并不好。现在我正在尝试将 url 存储在会话中。如果可行,但会话项值在第二次迭代中被覆盖。

也许我使用会话的方式不对?任何的想法?也许另一种 "better" 方式?

我的代码edit.blade

@if(url()->current() != URL::previous())
    @if(Session::has('myreferrer'))
        {{ Session::forget('myreferrer') }}
    @endif
    {{ Session::put('myreferrer', URL::previous()) }}
    <a href="{{ URL::previous() }}" class="btn">Cancel</a>
@else
<a href="{{ Session::pull('myreferrer') }}" class="btn">Back</a>
@endif

Session::pull() 从会话中获取值 并将其删除 。这就是页面第二次无法正常工作的原因:

  1. 用户访问编辑来自上一个
    • URL::current() != URL::previous()
    • 'myreferrer'设为上一个
    • 显示取消按钮
  2. 用户填写并保存编辑表单
    • URL::current() === URL::previous()
    • 'myreferrer'设置为null(因为Session::pull()
    • 显示后退按钮
  3. 用户再次保存编辑表单
    • URL::current() 仍然 === URL::previous()
    • 'myreferrer'还是null
    • 再次显示 后退 按钮,其中包含一个空的 URL(因为 'myreferrer'null),浏览器会将其解释为当前 URL

我们可以使用Session::get()取值留在session中,但这会污染session,因为当用户'myreferrer'仍然存在离开 edit 表单。

更重要的是,此逻辑不属于视图模板。相反,我们将使用控制器使用隐藏的输入字段传递 'myreferrer' 的值:

public function edit($id) 
{
    // fetch data...

    return view('edit') 
        // if "myreferrer" isn't in the session yet, use previous URL:
        ->with('myreferrer', Session::get('myreferrer', URL::previous()));
}

public function update(Request $request) 
{
    // save data...

    return back()
        ->with('success', 'Your success message.') 
        // "flashes" to the session only for the next page load:
        ->with('myreferrer', $request->get('myreferrer'));
}

<form ...>
    <input type="hidden" name="myreferrer" value="{{ $myreferrer }}"/>
    ... 
    @if (Session::has('success')) 
        <a href="{{ $myreferrer }}" class="btn">Back</a>
    @else 
        <a href="{{ $myreferrer }}" class="btn">Cancel</a>
    @endif

我假设您确实需要 previous URL 是动态的,例如如果用户可以打开 edit 来自不同页面的表单。 Named routes 在您不需要这种灵活性时提供更好的语义。

为了学习,这里有一些与您的代码相关的其他指针:

  • Session::forget() 之前我们不需要 Session::has()(如果密钥不存在,forget() 将跳过)。此外,无论如何,之后对 Session::put() 的调用都会覆盖此处的值,因此我们可以删除整个 @if(Session::has('myreferrer')) 块。
  • url()->URL:: 做同样的事情。为了保持一致性,我们可能应该选择一个。