【问题标题】:Return back from edit form after several updates in Laravel 5.4在 Laravel 5.4 中多次更新后从编辑表单返回
【发布时间】:2017-09-26 18:00:25
【问题描述】:

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

我想保留原始网址以进行多次更新。当用户第一次登陆编辑表单(从列表或单个视图)时,我想要一个取消按钮,将用户重定向回..“推荐人”。更新后,我重定向回编辑表单并显示成功消息。我想隐藏取消按钮并显示返回按钮。用户可以多次编辑。

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

也许我以错误的方式使用会话?任何想法?也许是另一种“更好”的方式?

我的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

【问题讨论】:

    标签: php laravel session laravel-5 laravel-5.4


    【解决方案1】:

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

    1. 用户从上一个访问编辑
      • URL::current() != URL::previous()
      • 'myreferrer' 设置为上一个
      • 显示取消按钮
    2. 用户填写并保存编辑表单
      • URL::current() === URL::previous()
      • 'myreferrer' 设置为null(因为Session::pull()
      • 显示返回按钮
    3. 用户再次保存编辑表单
      • URL::current() 仍然 === URL::previous()
      • 'myreferrer' 仍然 null
      • 再次显示 Back 按钮,并带有一个空 URL(因为 'myreferrer'null),浏览器将其解释为当前 URL

    我们可以使用Session::get() 来获取值将其留在会话中,但这会污染会话,因为当用户离开编辑'myreferrer'仍然存在/em> 形式。

    更重要的是,这个逻辑不属于视图模板。相反,我们将使用控制器通过隐藏输入字段传递'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()-&gt;URL:: 做同样的事情。我们可能应该选择一个以保持一致性。

    【讨论】:

    • 感谢您的出色而广泛的回答。我确实先尝试了隐藏输入,但完全忽略了我可以在编辑功能中设置 url ...您的解决方案效果很好。是的,我需要一个动态 URL。一件事仍然困扰着我。在我的情况下,'myreferrer' 在第二次迭代中没有设置为null。相反,我得到了指向编辑表单的前一个 url。好像它是在每次迭代中设置的。这就是为什么我开始把我猜想的事情变得过于复杂:)
    • 这是我的理论:如果浏览器看到&lt;a href=""&gt;...&lt;/a&gt;(一个空的href),它会回退到使用当前 URL 作为链接地址。 'myreferrer'null,留下了空的 href,但从浏览器看来,它实际上包含编辑表单的 URL。
    • 我尝试使用 var_dump 会话并将 'myreferrer' 设置为当前 url。所以我猜会话本身有一个“后备”。无论如何我不会使用刀片中的逻辑:)
    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多