如何解决在Laravel中搜索的条件路由 routes controller
在PHP 7.4上的Laravel 7中。我在/search
有一条GET路由,该路由被路由到SearchController
的{{1}}方法。这样就呈现了表单。用户填写搜索词并将其发布到index
(具有自己的单独路径)中,该词映射到/search
的{{1}}方法。很好。
结果在集合上使用分页,并且分页器生成的链接的格式为SearchController
,这些链接当然会导致GET请求。问题在于,无论是否带有URL参数,到results
端点的GET总是进入表单视图。我不清楚如何设置路由,以便通过与带有查询参数的GET相同的控制器方法来处理到/search?searchterm=foo&page=2
的POST。
我从此开始,它将呈现表单,接受搜索请求,并正确显示结果的 first 页,但是对其他具有分页参数的页面的请求最终又回到了搜索表单上:
/search
到目前为止,这是我尝试过的操作,接受对GET和POST的请求,检查输入,并将其发送到适当的控制器方法:
/search
这完全没有执行任何操作,只是GET和POST的空白屏幕而没有记录错误,因此我认为它与任何内容都不匹配。我真的不知道您是否可以像这样将一个路由定义放入另一个路由定义中。内部的Route::get('search','SearchController@index')->name('search.index');
Route::post('search','SearchController@results')->name('search.results');
路径的重复也感到错误。我找到了与此类似的示例,这些示例可以直接从路线返回不同的视图,但我想像往常一样将其发送给控制器。
为明确起见,到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');
}
});
的POST应该使用相同的控制器方法,并产生与到search
的GET相同的结果。
在我看来,我正在使用以下方法生成分页链接:
/search
我应该如何路由这些请求?使用/search?searchterm=foo&page=1
?定义与查询参数匹配的路由的某种方法?
解决方法
您只需检查memthod是post
还是get
,然后确定每种情况的处理方式。
SearchController
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');
,
使用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。