2015-12-30 3 views
1

Так у меня есть маршрут с 3 параметрами, как такзащита Route - Laravel

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

Для каждого запроса на этот маршрут, я хочу, чтобы проверить эти параметры, так или иначе.

Для параметра time я видел документы о том, как прикрепить regex к нему, но не в документации 5.2, но даже если я нашел документы мне нужно проверить другие, а также

Поэтому в основном я попробовал два различные способы проверки и проверки параметров, но никто не работает.

Метод 1 - Conroller

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 Docs, то 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.