Php 控制呼叫控制器';s的公共方法,可能吗?

Php 控制呼叫控制器';s的公共方法,可能吗?,php,Php,任务是保护调用公共控制器的方法;在打电话之前,我们需要检查用户是否是管理员 class AdminController { final public function __call($name, $arguments) { if (!Auth::isAuth()) { $User = UserFactory::loadById(Auth::getUserId()); if (!$User->isAdmin()) {

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

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

    }

}
我们可以使用magic
\uu call()
方法,但我们需要所有方法都是私有的

我看到的另一种方法是在
AdminController
中定义
final public\uu construct()
,并将checking$User->isAdmin()放在那里

还有其他想法吗


谢谢。

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

然后,在必须安全的控制器中(
AdminBaseController
)使用以下命令覆盖该方法:

public function isSecure() {
    return true;
}
AdminBaseController
扩展
BaseController
AdminCategoryController
应扩展
AdminBaseController

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

因此,在分派代码中,您可以使用如下内容(显然需要重构):


为什么我们需要实现
isSecure
方法?作为
AdminController
=所有方法都被安全调用。如果我没有为Admin/Public设置单独的控制器,那么实现
isSecure()
方法是可以的。顺便说一句,在我看来,最好在根控制器上定义
isSecure
,然后在每个子控制器上定义constanct
isu\u SECURE
。因此,您的调度代码可以在调用控制器之前进行检查。如果用户未经授权,您的调度员应将用户引导至
InvalidLoginController
或类似的机构,而不是
*AdminController
。你在评论的时候,我在稍微修改我的答案。我建议您在调度代码中捕获未经身份验证的用户,级别比控制器高。啊哈,我明白了。因此,在dispatcher中检查isCallable将允许我们实现功能齐全的ACL。伟大的
public function isSecure() {
    return true;
}
if($Controller->isSecure()) {
    if (!Auth::isAuth()) {
        $User = UserFactory::loadById(Auth::getUserId());
        if (!$User->isAdmin()) {
            throw new ForbiddenException();
        }
    } else {
        $Controller->view();
    }
}