Пользовательский фильтр Laravel

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

Я думал, что это должно быть сделано с фильтром, но я думаю, что мне чего-то не хватает в том, как они работают.

Итак, это мой фильтр:

Route::filter('my.filter', function()
{
//some code regarding said condition
if($mycondition==true){
//WHAT TO PUT HERE?
}else{
//Error message
}
}

И на моих маршрутах я буду иметь:

Route::group(array('before' => 'my.filter'), function()
{
Route::resource('cities', 'CitiesController');
//... many more controllers here
});

Но все примеры, которые я видел, имеют перенаправление внутри фильтра в части if. Я не хочу этого, я хочу только, если условие в фильтре истинно, вы видите этот URL.

0

Решение

Если вы хотите, чтобы ваш фильтр прекратил выполнение ваших маршрутов (и контроллеров и т. Д.), Вы должны:

  • Вернуть что-нибудь (например, перенаправление)
  • или бросить исключение

В Laravel вы можете сделать это довольно легко:

Route::filter('my.filter', function()
{
//some code regarding said condition
if($mycondition==true){
// here you have to do nothing so you could also flip the if...
}else{
App::abort(403);
}
}

Официальные документы

Little sidenote: Как упоминалось выше в комментарии, я бы перевернул if. Как это:

Route::filter('my.filter', function()
{
//some code regarding said condition
if($mycondition==false){
App::abort(403);
}
}
2

Другие решения

Вам не нужно ничего помещать туда, просто дайте функции вернуть void. Это скажет laravel, что пользователю разрешено видеть страницу. Вы всегда можете положить return там, чтобы позволить пользователю увидеть страницу и пропустить все следующие условия.

Когда условие не выполняется, лучше перенаправить пользователя на страницу, где вы объясняете, почему пользователь не может видеть страницу.

Route::filter('my.filter', function()
{
//some code regarding said condition
if($mycondition==true){
return;
}else{
//Error message
}
}
0

По вопросам рекламы [email protected]