我写了一个简短的脚本,它扫描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
)
)
答案 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));
}