2015-12-30 126 views
1

所以,我必须像这样路由保护 - Laravel

Route::get('search-restaurant/{location}/{day}/{time}', '[email protected]_restaurant'); 

与3个参数的路线的每个请求这条路线,我想验证以某种方式或其他这些参数。

对于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

任何指导赞赏

回答

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])', 
]); 

上述路线将检查正则表达式中的所有参数将它传递给Closure[email protected]之前(根据需要进行修改)

Here是链接到5.1文档的情况下,你需要它。

+0

欣赏解说!!! –

0

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

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)那样使用用户路由参数 - 我没有测试过它,但它应该可以工作,或者(这是推荐的),您应该使用例如Form Validation Request来完成此操作。