Laravel / PHP - 从子类返回/重定向

时间:2014-09-24 10:17:28

标签: php laravel laravel-4 laravel-routing

这是我的孩子控制员:

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中的数组参数。正如您所看到的,我需要将一系列角色传递给函数。

请帮忙。

2 个答案:

答案 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.