簡體   English   中英

在 Laravel 5.4 中多次更新后從編輯表單返回

[英]Return back from edit form after several updates in Laravel 5.4

我正在嘗試向我的編輯表單添加功能。 也許不是最佳實踐,但是...

我想保留原始網址以進行多次更新。 當用戶第一次登陸編輯表單(從列表或單個視圖)時,我想要一個取消按鈕,將用戶重定向回..“推薦人”。 更新后,我重定向回帶有成功消息的編輯表單。 我想隱藏取消按鈕並顯示后退按鈕。 用戶可以多次編輯。

我試圖通過請求傳遞原始 url,但這並沒有很好的結束。 現在我正在嘗試在會話中存儲 url。 如果有效,但會話項值在第二次迭代中被覆蓋。

也許我以錯誤的方式使用會話? 任何的想法? 也許另一種“更好”的方式?

我的 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()獲取值並將其保留在會話中,但這會污染會話,因為當用戶離開編輯表單時, 'myreferrer'仍然存在。

更重要的是,這個邏輯不屬於視圖模板。 相反,我們將使用控制器使用隱藏輸入字段傳遞'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

我假設您實際上需要先前的URL 是動態的,例如用戶是否可以從不同的頁面打開編輯表單。 當您不需要這種靈活性時,命名路由會提供更好的語義。

為了學習,這里有一些與您的代碼相關的其他指針:

  • Session::forget() Session::has()之前我們不需要Session::has() forget()如果鍵不存在,則forget()跳過)。 此外,調用Session::put()之后無論如何都會覆蓋這里的值,因此我們可以刪除整個@if(Session::has('myreferrer'))塊。
  • url()->URL::做同樣的事情。 我們可能應該選擇一個以保持一致性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM