路由保护 - 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])',
]);

以上路由将在将其传递给 ClosureController@action(根据需要修改)

之前检查所有参数的正则表达式

Here 是 5.1 文档的 link,以备不时之需。