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()
从会话中获取值 并将其删除 。这就是页面第二次无法正常工作的原因:
- 用户访问编辑来自上一个
URL::current() != URL::previous()
'myreferrer'
设为上一个
- 显示取消按钮
- 用户填写并保存编辑表单
URL::current() === URL::previous()
'myreferrer'
设置为null
(因为Session::pull()
)
- 显示后退按钮
- 用户再次保存编辑表单
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::
做同样的事情。为了保持一致性,我们可能应该选择一个。
我正在尝试为我的编辑表单添加功能。也许不是最佳实践,但是...
我想保留原版 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()
从会话中获取值 并将其删除 。这就是页面第二次无法正常工作的原因:
- 用户访问编辑来自上一个
URL::current() != URL::previous()
'myreferrer'
设为上一个- 显示取消按钮
- 用户填写并保存编辑表单
URL::current() === URL::previous()
'myreferrer'
设置为null
(因为Session::pull()
)- 显示后退按钮
- 用户再次保存编辑表单
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::
做同样的事情。为了保持一致性,我们可能应该选择一个。