路由保护 - Laravel
Route protection - Laravel
所以我有一个包含 3 个参数的路由,就像这样
Route::get('search-restaurant/{location}/{day}/{time}', 'WebController@search_restaurant');
对于此路由的每个请求,我想以某种方式验证这些参数。
对于 time
参数,我看到了如何将 regex
附加到它的文档,但 5.2
中没有文档,但即使我找到了我需要验证的文档其他人也是
所以基本上我尝试了两种不同的方法来检查和验证参数,但 none 有效。
方法 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
.
感谢任何指导
我已经注意到的第一个问题是以下情况:
if($day != 'today' || $day != 'tomorrow') { // check string
abort(500);
}
它将始终为真,因此您将始终收到 500 错误页面。
现在,如果有人将 today
用作 $day
,则 (false || true)
将计算为 true
,如果 tomorrow
则相同。
您应该将此处的运算符从 ||
更改为 '&&':
if($day != 'today' && $day != 'tomorrow') { // check string
abort(500);
}
或在此处使用in_array
if(!in_array($day, ['today','tomorrow'])) { // check string
abort(500);
}
但是还有一件事。你不应该在你的控制器或中间件中这样做。您可以使用 5.1 中的路由参数(https://laravel.com/docs/5.1/routing#route-parameters) - I haven't tested it but it should work or (this is recommended) you should use for example Form Validation Request 来完成。
首先,您可能想回到条件语句的基础知识。
如果需要验证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
}
我为收到 off-topic 道歉,但是是的,在 5.2 文档中,regex
可能已被删除或移动到其他地方,但您仍然可以在 5.1[=19= 中找到这些文档]
尽管如此,我建议您在路由中使用约束,而不是在控制器或中间件中检查它。
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
(根据需要修改)
之前检查所有参数的正则表达式
Here 是 5.1 文档的 link,以备不时之需。
所以我有一个包含 3 个参数的路由,就像这样
Route::get('search-restaurant/{location}/{day}/{time}', 'WebController@search_restaurant');
对于此路由的每个请求,我想以某种方式验证这些参数。
对于 time
参数,我看到了如何将 regex
附加到它的文档,但 5.2
中没有文档,但即使我找到了我需要验证的文档其他人也是
所以基本上我尝试了两种不同的方法来检查和验证参数,但 none 有效。
方法 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
.
感谢任何指导
我已经注意到的第一个问题是以下情况:
if($day != 'today' || $day != 'tomorrow') { // check string
abort(500);
}
它将始终为真,因此您将始终收到 500 错误页面。
现在,如果有人将 today
用作 $day
,则 (false || true)
将计算为 true
,如果 tomorrow
则相同。
您应该将此处的运算符从 ||
更改为 '&&':
if($day != 'today' && $day != 'tomorrow') { // check string
abort(500);
}
或在此处使用in_array
if(!in_array($day, ['today','tomorrow'])) { // check string
abort(500);
}
但是还有一件事。你不应该在你的控制器或中间件中这样做。您可以使用 5.1 中的路由参数(https://laravel.com/docs/5.1/routing#route-parameters) - I haven't tested it but it should work or (this is recommended) you should use for example Form Validation Request 来完成。
首先,您可能想回到条件语句的基础知识。
如果需要验证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
}
我为收到 off-topic 道歉,但是是的,在 5.2 文档中,regex
可能已被删除或移动到其他地方,但您仍然可以在 5.1[=19= 中找到这些文档]
尽管如此,我建议您在路由中使用约束,而不是在控制器或中间件中检查它。
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
(根据需要修改)
Here 是 5.1 文档的 link,以备不时之需。