Laravel / возврат / перенаправление из дочернего класса

Это мой дочерний контроллер:

class VolunteersController extends \BaseController
{
public function index()
{
$this->checkForRoles(['admin']);
//list some secret stuff for admin
}
}

В моем базовом контроллере я сделал это:

class BaseController extends Controller
{
protected function checkForRoles($roles)
{
foreach ($roles as $role) {
if (!(Auth::user()->hasRole($role))) {
return Redirect::to('/');
}
}
}
}

Теперь я ожидал, что линия return Redirect::to('/'); в BaseController будет перенаправлять пользователя на домашнюю страницу, если его роль не является администратором.

Но этого не происходит. //list some secret stuff for admin исполняется в любом случае.

Редактировать:
Некоторые люди могут задаться вопросом, почему я не использую фильтры. Ну да, желаемая функциональность — это фильтры, но, очевидно, фильтры еще не поддерживают аргументы массива в Laravel. И, как вы можете видеть, мне нужно передать массив функций в функцию.

Пожалуйста помоги.

2

Решение

Перенаправление произойдет только в том случае, если VolunteersController :: index () вернет «Перенаправление». Это не так в вашем коде.

Было бы, если бы вы имели

class VolunteersController extends \BaseController
{
public function index()
{
if ($res = $this->checkForRoles(['admin'])) return $res;
//list some secret stuff for admin
}
}
2

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

Я бы переместил логику в фильтр, который позволит Redirect функционировать должным образом. Это та вещь, для которой были разработаны фильтры.

Если вам нужно передать несколько ролей фильтру, вместо того, чтобы передавать массив фильтру (что Laravel не допустит), используйте разделитель, такой как «+», а затем explode параметр в фильтре для имитации передачи массива.

Например, ваш маршрут будет:

Route::get('volunteer', array(
'before' => 'roles:admin+author',
'uses' => 'VolunteersController@index'
));

…и тогда ваш фильтр может легко преобразовать несколько ролей в массив:

Route::filter('roles', function($route, $request, $roles)
{
$roles = explode('+', $roles);
// 'admin+author' becomes ['admin', 'author'];
// continue with your checkForRoles function from above:
foreach ($roles as $role) {
if (!(Auth::user()->hasRole($role))) {
return Redirect::to('/');
}
}
}

Затем вы можете удалить логику из BaseController.

Или вы Можно передать несколько параметров в фильтр в виде списка через запятую. Так что, если вы назвали свой маршрут с 'before' => 'roles:admin,author'Вы можете получить к ним доступ в своем фильтре, используя func_get_args():

Route::filter('roles', function($route, $request, $roles)
{
$roles = array_slice(func_get_args(), 2); // remove $route and $request
//...continue as above.
0

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