控制呼叫控制器的公共方法,有可能吗?

时间:2011-04-21 10:20:51

标签: php

任务是保护呼叫公共控制器的方法;我们需要在打电话之前检查用户是否是管理员。

class AdminController {

    final public function __call($name, $arguments) {
        if (!Auth::isAuth()) {
            $User = UserFactory::loadById(Auth::getUserId());
            if (!$User->isAdmin()) {
                throw new ForbiddenException();
            }
        }
        return call_user_func_array(array($this, $name), $arguments);
    }

}

class AdminCategoryController extends AdminController {

    public function view() { //__call() won't be called bacause it is public method

    }

}

我们可以使用魔术__call()方法,但我们需要所有方法private

我看到的另一种方法是在final public __construct()定义AdminController并在那里检查$ User-> isAdmin()...

还有其他想法吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

在基本控制器(BaseController)中创建一个名为isSecure()的新方法:

public function isSecure() {
    return false;
}

然后在您的控制器中必须安全(AdminBaseController)覆盖方法:

public function isSecure() {
    return true;
}

AdminBaseController延伸BaseControllerAdminCategoryController应延长AdminBaseController

然后,您可以随时在任何控制器上调用$Controller->isSecure(),以确定它是否必须安全。

因此,在您的调度代码中,您可以使用类似的东西(显然需要重构):

if($Controller->isSecure()) {
    if (!Auth::isAuth()) {
        $User = UserFactory::loadById(Auth::getUserId());
        if (!$User->isAdmin()) {
            throw new ForbiddenException();
        }
    } else {
        $Controller->view();
    }
}