这是我的孩子控制员:
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('/');
}
}
}
}
现在我的预期是,如果他的角色不是管理员,那么BaseController中的行return Redirect::to('/');
会将用户重定向到主页。
但它不会发生。 <{1}}无论如何都会被执行。
修改 有些人可能会想,我为什么不使用过滤器。好吧,所需的功能是过滤器,但显然过滤器还不支持Laravel中的数组参数。正如您所看到的,我需要将一系列角色传递给函数。
请帮忙。
答案 0 :(得分:2)
只有当VolunteersController :: index()返回&#34;重定向&#34;时才会发生重定向。它不会在您的代码中执行此操作。
如果你有,
class VolunteersController extends \BaseController
{
public function index()
{
if ($res = $this->checkForRoles(['admin'])) return $res;
//list some secret stuff for admin
}
}
答案 1 :(得分:0)
我会将逻辑移动到过滤器,这将允许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.