使用会话中保存的过滤器选项进行索引重定向

时间:2019-01-09 13:49:30

标签: php laravel filtering state laravel-blade

因此,我目前所拥有的是一条正常的资源路线,具有通常的索引,创建,存储,编辑,更新。在索引中,我有一些过滤器选项可以过滤出条目。很简单。我想要的是保存过滤器选项,并且在创建,更新或删除该选项时,将您重定向回索引时,仍然可以保存和过滤过滤器选项。我遇到的问题是我不想被不必要的重定向。过滤器采用表格形式,每当其值更改时,它都会不断将其发布到索引中。在那种情况下,我不希望它成为重定向。到目前为止,我已经尝试找出是重定向还是只是更改的过滤器。我想知道在这种情况下索引路由是否先前的路由与当前的路由相同。但是,资源都以相同的路由名称开头。重定向网址存储在会话中的“ cultivar_form_return_url”变量下,然后放入变量中,以检查是否需要重定向。

session(['cultivar_form_return_url' => $request->fullUrl()], '');
$redirect_url = $request->session()->get('cultivar_form_return_url', '');

if($redirect_url && !$has_filtered && !$filter) {
   return redirect($redirect_url);
}
$cultivars = $query
            ->orderBy('name')
            ->paginate(20);

return view('database.cultivars.index',compact('cultivars','filter','redirect_url'));

$ redirect_url是提交过滤器请求时创建的URL。我从创建,更新或删除返回时使用此URL重定向到。 其中包含用于搜索的参数。我检查redirect_url是否存在,对于重定向的第二个参数,我创建了一个以false开头的变量,并且如果我的请求在每个函数中都具有用于过滤器的参数,则将该变量设置为true,如下所示。

if($request->has('input')) {
   $has_filtered = true;
   $query = $query->where('input', $request->input);
   $filter['input'] = $request->input;
}

重定向检查的最后一个参数是filter变量,其中包含我的过滤器选项,该过滤器选项开始为空,并且在设置了特定过滤器的情况下在每个函数中进行设置。

$has_filtered = false;

    $query = (new Cultivar);

    $filter = [
        'search' => null,
        'crop' => null,
        'is_rootstock' => null,
        'is_public' => null,
    ];

我想区分重定向和仅更改的过滤器选项。谢谢。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

更多地考虑了问题之后,我想我可能会回答我的问题。

$redirect_url = $request->session()->get('cultivar_form_return_url', '');

    if($redirect_url && !$has_filtered && url()->previous() != route('database.cultivars.index')) {

        session(['cultivar_form_return_url' => '']);

        return redirect($redirect_url);
    }

    session(['cultivar_form_return_url' => $request->fullUrl()]);

这将阻止它一遍又一遍地重定向到自身,同时仍然保留过滤器选项。同时也不会不必要地重定向。

答案 1 :(得分:0)

因此,经过一些测试,我先前的答案仍然存在一些错误。所以我想出了一个更好的解决方案。我没有将重定向URL保存到会话中,而是将其作为输入之一放入form.php中。编辑和创建都可以通过form.php进行。我只是隐藏了该字段,并使用该字段来跟踪过滤器的先前状态。

<input type="hidden" name="redirect_url" value="{{ $redirect_url }}">

重定向路由从通用路由('database.cultivars.index')开始,然后我检查它们是否为旧状态,以便在验证错误或可能重定向您的任何东西时通过重定向路由到同一页面以保留过滤器设置。然后,我然后检查以前的路由是否与当前路由匹配,并且是否匹配,这意味着页面已刷新或存在验证错误。如果先前路径和当前路径不同,则意味着您只是来自索引而已,无法进行编辑或创建。然后,我抓住那条路线并将其发送到视图以放入隐藏字段中,然后重复该过程。

$redirect_url = route('database.cultivars.index');

if($request->old('redirect_url')) {
   $redirect_url = $request->old('redirect_url');
} else if(url()->previous() != route('database.cultivars.edit', $cultivar)) {
   $redirect_url = url()->previous();
}

成功创建或更新了一个品种后,如果存在,您将被重定向到重定向URL。如果没有,您将被重定向到route('database.cultivars.index')。这一部分在存储和更新控制器功能中。

if($request->has('redirect_url')) {
    $redirect_url = $request->redirect_url;
}

if($redirect_url && starts_with($redirect_url, route('database.cultivars.index'))) {
    return redirect($redirect_url);
}

有了这个答案,没有错误,也没有不必要的重定向。