我试图在PHP框架中构建基于角色的访问控制。该框架在MVC架构上,因此每条路径都适用于/controller/action/param
。我们可以在初始化时获得控制器和操作,并将它们存储在变量$ controller,$ action中。现在我的想法是使用一个类来检查这个动作的权限,如:
Auth::permissions($controller, $action);
现在我希望我能以某种方式创建一个脚本,它可以在/ modules /文件夹中找到控制器的所有公共方法。这样我就可以运行一个脚本,它会将所有控制器操作作为列表更新到数据库,我们将从中获取角色权限。这样我就可以避免手动插入所有控制器操作。获取所有控制器非常简单,因为文件夹结构如下:
/modules
/controller
controller.php
所以我可以找到模块上的所有子目录,最后添加.php。 我的问题是我可以以某种方式获取文件的公共方法吗?
class Example extends Controller {
public function main() {
return 'foo';
}
}
这样我可以将其作为
存储在数据库中example | main | role_id
答案 0 :(得分:1)
以下是一些可以帮助您的代码:
<?php
class Example {
public function main() {
return 'foo';
}
private function privatefunc(){
}
public function anotherpublicfunc(){
}
}
$reflector = new ReflectionClass("Example");
foreach($reflector->getMethods() as $method){
if($method->isPublic()) {
echo "Method ".$method->name." is public".PHP_EOL;
}else{
echo "Method ".$method->name." is not public".PHP_EOL;
}
}
?>
输出:
Method main is public
Method privatefunc is not public
Method anotherpublicfunc is public
答案 1 :(得分:0)
如果您想获取课程的公开方法,那么您可以使用get_class_methods
阅读doc here
class Car {
public function permission_method_two() {
}
public function permission_method_three() {
}
private function private_function() {
}
}
echo '<pre>'.print_r(get_class_methods('Car'),1).'</pre>';
// prints only public methods:
Array
(
[0] => permission_method_two
[1] => permission_method_three
)
答案 2 :(得分:0)
您可以遵循惯例: - 每个公共方法都没有低位启动 - 每个私有和受保护的方法都以lowdash
开头实施例
class Example
{
public function publicMethod()
{
}
private function _privateMethod()
{
}
protected function _protectedMethod()
{
}
}
然后使用http://php.net/manual/ru/function.get-class-methods.php
foreach(get_class_methods('Example') as $methodName){
if(strpos($methodName, '_') !== 0) $publicMethod[] = $methodName;
}