【问题标题】:Conditional routing for searching in Laravel在 Laravel 中搜索的条件路由
【发布时间】:2020-12-02 06:51:27
【问题描述】:

在 PHP 7.4 上的 Laravel 7 中。我在/search 有一个GET 路由,它被路由到SearchControllerindex 方法。这会呈现表单。用户填写一个搜索词并将其发布到/search(具有自己的单独路由),它映射到SearchControllerresults 方法。这一切都很好。

结果对集合使用分页,分页器生成的链接格式为/search?searchterm=foo&page=2,这些当然会产生GET请求。问题是对/search 端点的GET,无论是否带有URL 参数,总是会转到表单视图。我不清楚我应该如何设置我的路由,以便通过与带有查询参数的 GET 相同的控制器方法处理到 /search 的 POST。

我从这个开始,它呈现表单,接受搜索请求,并正确显示结果的 第一页,但对其他页面的请求与分页参数最终回到搜索表单:

Route::get('search', 'SearchController@index')->name('search.index');
Route::post('search', 'SearchController@results')->name('search.results');

这是我迄今为止尝试过的,接受对 GET 和 POST 的请求,检查输入,并将其发送到适当的控制器方法:

Route::match(['get', 'post'], 'search', function () {
    if (request()->filled('searchterm')) {
        Route::post('search', 'SearchController@results')->name('search.results');
    } else {
        Route::get('search', 'SearchController@index')->name('search.index');
    }
});

这确实......什么都没有,只是 GET 和 POST 的空白屏幕没有记录任何错误,所以我认为它不匹配任何内容。我真的不知道您是否可以像这样将一个路由定义放在另一个路由定义中。在其中重复search 路径也感觉不对。我发现了与此类似的示例,它们直接从路由返回不同的视图,但我想像往常一样将它发送到控制器。

澄清一下,发送到/search 的 POST 应该使用相同的控制器方法并产生与发送到 /search?searchterm=foo&page=1 的 GET 相同的结果。

在我看来,我正在生成分页链接:

{{ $items->withQueryString()->links() }}

我应该如何路由这些请求?使用redirect()?定义匹配查询参数的路由的某种方式?

【问题讨论】:

    标签: php laravel routes


    【解决方案1】:

    您可以简单地检查 memthod 是 post 还是 get 并决定针对每种情况执行什么操作。

    搜索控制器

    class SearchController extends Controllr {
      public function index(Request $request){
        // you do any conditions check here ... 
        if($request->isMethod('post')) {
          return $this->postSearch($request);
        }
    
        // Get code here
      }
    
    
      public function postSearch(Request $request){
        // Post code here
      }
    }
    

    路由文件:

    web.php

    Route::match(['post', 'get'], '/search', 'SearchController@index')->name('search');
    

    【讨论】:

    • 这只是将同样的问题转移到我的控制器内部?它不像 GET 与 POST 那样简单——这就是我开始的情况。
    【解决方案2】:

    只要你使用Route::match(['get', 'post'], 'search', function () {...,回调就会变成结果,这意味着调度已经发生。您可以添加路线,但为时已晚。所以你必须在调度之前匹配。

    在你的回调中放置一个echo,你会看到:)

    你可以这样做:

    routes

    Route::get('/', 'SearchController@index');
    Route::post('/', 'SearchController@results');
    

    controller

    class SearchController extends Controller {
        public function index(Request $request) {
            if ($request->has('searchterm')) {
                return $this->results($request);
            }
    
            return view(/* ... */);
        }
    
        public function results(Request $request) {
            return view(/* ... */);
        }
    }    
    

    Malkhazi Dartsmelidze 有点先搞定:D

    【讨论】:

    • 文档显示 where 匹配命名 URL 参数而不是查询字符串参数 - 它似乎与我的分页请求不匹配
    • 当好的,查询 - 在这种情况下,我们可以使用 filter 并重定向,因为我们在那里收到了请求。 - 仍然不确定之前是否有匹配的方法。稍后会进行实验:)
    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 2020-08-23
    • 1970-01-01
    • 2021-09-30
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    相关资源
    最近更新 更多