路线保护-Laravel

问题描述 投票:1回答:2

所以我有一条带有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

任何指导表示赞赏

php laravel laravel-5 laravel-5.2
2个回答
1
投票

首先,您可能想回到条件查询的基础。

如果您需要验证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])',
]);

上面的路由将在将其传递给ClosureController@action之前检查所有参数的正则表达式(根据需要进行修改)

如果需要, 这里是5.1文档的链接。


0
投票

我已经注意到的第一个问题是以下情况:

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完成验证请求

© www.soinside.com 2019 - 2024. All rights reserved.