【问题标题】:Index Redirect With Filter Options Saved In Session使用会话中保存的过滤器选项进行索引重定向
【发布时间】:2019-06-04 07:37:49
【问题描述】:

所以我现在拥有的是一个正常的资源路径,包括索引、创建、存储、编辑、更新,通常。在索引中,我有一些过滤器选项可以过滤掉条目。很简单。我想要的是保存过滤器选项,并且当您创建、更新或删除它时,当您被重定向回索引时,您的过滤器选项仍然被保存和过滤。我遇到的问题是我不想进行不必要的重定向。过滤器是一种形式,每次它的值发生变化时它都会不断地发布到索引中。在那种情况下,我不希望它成为重定向。到目前为止,我已经尝试找出它是重定向还是只是一个已更改的过滤器。在这种情况下,我希望能够判断上一条路线是否与当前路线相同,即索引路线。但是,资源都以相同的路由名称开头。重定向 url 存储在 '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;
}

重定向检查的最后一个参数是过滤器变量,它包含我的过滤器选项,如果设置了特定的过滤器,它会在每个函数中设置。

$has_filtered = false;

    $query = (new Cultivar);

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

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

【问题讨论】:

    标签: php laravel filtering state laravel-blade


    【解决方案1】:

    在对这个问题进行了更多思考之后,我想我的问题可能会有答案。

    $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()]);
    

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

    【讨论】:

      【解决方案2】:

      所以我之前的回答,经过一些测试后仍然有一些错误。所以我想出了一个更好的解决方案。我没有将重定向 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();
      }
      

      当您成功创建或更新品种后,您将被重定向到重定向网址(如果有的话)。如果没有,您将被重定向到 route('database.cultivars.index')。这部分在 store 和 update 控制器函数中都有。

      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);
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-14
        • 2021-11-29
        相关资源
        最近更新 更多