所以我有一条带有3个参数的路线
Route::get('search-restaurant/{location}/{day}/{time}', 'WebController@search_restaurant');
对于对此路由的每个请求,我都希望以某种方式验证这些参数。
对于time
参数,我已经看到了有关如何将regex
附加到其上的文档,但是在5.2
却没有文档,但是即使找到了文档,我也需要验证其他
因此,基本上我尝试了两种不同的方法来检查和验证参数,但是没有一种起作用。
方法1-控制器
public function search_restaurant ($location, $day, $time) {
if($day != 'today' || $day != 'tomorrow') {
abort(500);
} elseif (!in_array($location, $locations)) {
abort(500);
} elseif (!preg_match("/(2[0-3]|[01][0-9])([0-5][0-9])/", $time) && $time != "asap") {
abort(500);
} elseif ($day == "tomorrow" && $time == "asap") {
abort(500);
} else {
.....//rest of code - send to view
}
}
方法2-中间件
public function handle($request, Closure $next)
{
$location = $request->route('location');
$day = $request->route('day');
$time = $request->route('time');
$locations = Array('central','garki-1','garki-2','wuse-2','wuse-1','gwarimpa','maitama','asokoro');
if($day != 'today' || $day != 'tomorrow') { // check string
abort(500);
} elseif (!in_array($location, $locations)) { // check against array
abort(500);
} elseif (!preg_match("/(2[0-3]|[01][0-9])([0-5][0-9])/", $time) && $time != "asap") { // check agains regex
abort(500);
} elseif ($day == "tomorrow" && $time == "asap") { // check against string
abort(500);
}
return $next($request);
}
如您所见,我很简单地在变量上执行简单的if..else
语句,但条件似乎总是正确的。 我也一一尝试了这些规则,但是每一次失败,我都会被发送到500 page
。
任何指导表示赞赏
首先,您可能想回到条件查询的基础。
如果您需要验证3个参数,你需要做3 if
if ($param1 === $validLocation) {}
if ($param2 === $validDay) {}
if ($param3 === $validTime) {}
if...elseif...else
条件条件起作用,则方法是,一旦满足第一个条件,便不再检查其余条件。
// if this condition is true, PHP will not check for further `elseif` or `else
if($day != 'today' || $day != 'tomorrow') {
abort(500);
} elseif (!in_array($location, $locations)) {
abort(500);
} else {
//rest of code - send to view
}
我为偏离主题而致歉,但是,是的,在5.2文档中, regex
可能已被删除或移动到其他地方,但是您仍然可以在5.1中找到这些文档
尽管如此,我还是建议您在路由中使用约束,而不要在控制器或中间件中检查约束。
Route::get('test/{location}/{day}/{time}', function ($location, $day, $time) {
dd($location, $day, $time);
})->where([
'location' => 'central|garki-1|garki-2|wuse-2|wuse-1|gwarimpa|maitama|asokoro',
'day' => 'today|tomorrow',
'time' => 'asap|(2[0-3]|[01][0-9])([0-5][0-9])',
]);
上面的路由将在将其传递给Closure
或Controller@action
之前检查所有参数的正则表达式(根据需要进行修改)
如果需要, 这里是5.1文档的链接。
我已经注意到的第一个问题是以下情况:
if($day != 'today' || $day != 'tomorrow') { // check string
abort(500);
}
这将永远是对的,因此您将始终获得500错误页面。
现在,如果有人将today
用作$day
则它将是if (false || true)
它的评估结果为true
,如果是tomorrow
则为true
。
您应将此处的运算符从||
更改为 至 '&&':
if($day != 'today' && $day != 'tomorrow') { // check string
abort(500);
}
或在这里使用in_array
if(!in_array($day, ['today','tomorrow'])) { // check string
abort(500);
}
但是还有一件事。 您宁可不要在Controller或中间件中执行此操作。 您可以像5.1( https://laravel.com/docs/5.1/routing#route-parameters )中那样使用路由参数-我尚未对其进行测试,但它应该可以工作,或者(建议)您应该使用Form完成验证请求 。