解析控制器以获取方法和额外的代码/变量

时间:2015-01-05 14:48:14

标签: php codeigniter parsing codeigniter-2

我写了一个简短的脚本,它扫描application/controllers并将控制器和方法的名称插入到数据库中。这是ACL模块的一部分,它允许我向用户授予权限。

我正在使用以下函数获取方法 -

$classname = ucfirst(substr($filename, 0, strrpos($filename, '.')));
$methods = get_class_methods($classname); 

处理后我得到以下数组

Array
(
    [0] => Array
        (
            [controller] => Inbox
            [method] => index
        )

    [1] => Array
        (
            [controller] => Inbox
            [method] => read
        )

    [2] => Array
        (
            [controller] => Inbox
            [method] => write
        )
)

我面临的问题是,当我向任何控制器添加新方法时,数据库中的唯一ID不再与我在其中根据这些ID向用户提供权限的其他表匹配。另一个问题是某些方法的名称不是自我解释的,这使得从数据库中列出它们时很难理解权限。

我认为解决方案是以某种方式解析控制器中方法名称的部分,然后读取一些额外的数据(可能来自注释),这样我就可以为每个方法提供唯一的ID,这将确保权限保持不变无论控制器的结构如何,都链接到用户。

例如

function read(){
//Desc:Reads a message.
//Unique method ID:2
...
}

并且插入的数组类似于

Array
    (
        [0] => Array
            (
                [id] => 1
                [desc] => nothing to do here
                [controller] => Inbox
                [method] => index
            )

        [1] => Array
            (
                [id] => 2
                [desc] => read a message
                [controller] => Inbox
                [method] => read
            )

        [2] => Array
            (
                [id] => 3
                [desc] => send a message
                [controller] => Inbox
                [method] => write
            )
    )

1 个答案:

答案 0 :(得分:1)

为什么不将ACL表的主键设为从类名和方法生成的段,而不是整数?
这样,当您添加新的控制器/方法时,它不会有所作为。

表的非常基本的例子;
操作

-----------------------------------
| id         | controller | method|
|---------------------------------|
| inbox_read | Inbox      | read  |

ACL

-----------------------
|user_id | acl_slug   |    
|--------|------------|
|  1     | inbox_read |

您可能想要创建slug的一个小代码示例;

foreach ($method_array as $action) {
    $slug = strtolower(implode('_', $action));
}