在类构造函数中找出调用的方法名称?

时间:2017-06-12 16:16:01

标签: php model-view-controller authorization

是否可以从__construct()函数中获取类中被调用方法的名称?

我有一个MVC应用程序,其中用户具有权限,并且对于用户访问控制器(类)中的特定路由(方法),他们必须具有我想在控制器的构造方法中定义的某些权限,因为我不知道我想用重复的代码弄乱我的控制器只是为了检查用户是否在每种方法中都有一定的权限。

1 个答案:

答案 0 :(得分:1)

  

是否可以从类中获取被调用方法的名称   __construct()函数?

没有。调用方法时不调用构造函数,在创建对象实例时调用它。因此,当您调用该方法时,构造函数已经完成。

  

我想在控制器的构造方法中定义因为我   我不想把重复的代码弄乱我的控制器   检查用户是否在每种方法中都有一定的权限。

在这种情况下,您可以创建一个protected函数来执行权限检查,然后从每个公共路由方法中调用它:

class Controller
{

    protected function checkPermissions($route)
    {
        // ...
    }

    public function someRoute()
    {
        $this->checkPermissions(__METHOD__);
        // ...
    }

    public function someOtherRoute()
    {
        $this->checkPermissions(__METHOD__);
        // ...
    }

}

或者更好的是,您可能还有一些其他代码可以自动实例化Controller对象,然后查找要触发的正确方法。如果是这样,您可以添加调用以检查该代码块的权限,然后您根本不需要触摸路径方法:

$controllerName = // determined by analyzing URL;
$routeName = // determined by analyzing URL;
if (!class_exists($controllerName)) {
    throw new Exception('no such controller');
}
$controller = new $controllerName();
if (!method_exists($controller, $routeName)) {
    throw new Exception('no such route in controller');
}
$controller->checkPermissions($routeName);
$controller->$routeName();