gowrav-vishwakarma / atk4acl
This package is auto-updated.
Last update: 2024-08-29 05:06:34 UTC
README
我们已经在4.3版本中使用这个Acl很长时间了,发现它大大加快了我们的开发过程。这是一个真正让您专注于业务逻辑的系统。在这里,我们将它作为atk4/ui插件推出。
基本功能
此ACL系统的基本很简单。任何系统中的每个实体都有一个或多个状态,每个状态都有一些可执行的操作。在任何ACL中,您都希望完成以下两项工作。
-
决定哪些状态可见给哪些用户(例如,假设您有一个发票文档,它在不同的状态下有以下操作)
$actions = [ 'Active'=>['view','edit','delete','deactivate','superpass'], 'InActive'=>['view','edit','delete','activate'], ];
现在您想管理以下ACL
- 草稿用户只能看到他们创建的内容,并且他们应该能够提交它。
- 具有审批权限的权限应该看到所有提交的文档,并且能够审批发票。
- 创建草稿的人应该能够看到已批准的发票状态,但他将无法对此执行任何操作。
- 批准的发票应启用send_via_email并仅允许某些角色使用。
- 实现所有这些功能应该很容易,系统应该帮助您以非常简单的方法实现。
这就是Atk4Acl的作用。
安装
安装过程就像
- composer require gowrav-vishwakarma/atk4acl
- 第二步是将Sql文件填充到
vendor/gowrav-vishwakarma/atk4acl/docs
文件夹中。 - 将
vendor/gowrav-vishwakarma/atk4acl/src/config-example.php
中定义的一些配置填充到您的配置文件中(而不是此文件)。
设置带有角色的认证模型
- 到目前为止,您有一个用户模型,它使用
atk4\login
作为$app->auth->model
。 $your_model->hasOne('role_id',new \atk4\acl\Model\Role)->withTitle();
- 就这样。顺便说一下,如果您想使用配置来使用Department->Post->Employee,并且想在Employee中用post_id作为角色,这也是可定制的。
进入操作
设置完成后,您现在可以开始使用它了。您应该关注以下两点
- 如何定义权限
- 如何编写状态/操作关系并编写操作代码
您将做的第一件事是使用\atk4\acl\CRUD,如下所示
$crud = $this->add('\atk4\acl\CRUD');
$crud->setModel('\your\namespace\Model\Invoice');
基于您在配置中定义的超级作用域角色
$config['acl']=[
'AclModelClass'=>'\atk4\acl\Model\Acl',
'UserModel' =>'\your\namespace\Model\Employee',
'SuperUserRoles'=>['SuperUser'], ⇐ HERE
];
您将自动在CRUD上方获得ACL按钮,它将为您管理一切。但是,为了使其运行,您需要首先在模型中定义您的状态和操作。
在状态上定义操作就像在模型中创建一个名为**public $actions **的公共类变量一样简单。
$actions = [
'Active'=>['view','edit','delete','deactivate','superpass'],
'InActive'=>['view','edit','delete','activate'],
];
其中“查看”、“编辑”和“删除”操作将自动处理,使用选项 SelfOnly , All, None
SelfOnly意味着用户只能执行他/她自己创建的操作(基于模型中的created_by_id
字段)。
而All允许用户查看该状态的所有实体。
如果您的模型具有assigned_to_id
字段,您甚至可以仅管理执行分配实体操作的用户。
下面是有趣的代码部分。如何为这些操作编写代码。对于查看、编辑和删除,您不需要编写任何代码。但对于其他操作,您只需在模型中创建具有该操作名称的函数即可。例如,要编写“禁用”操作,只需在模型中创建一个名为“deactive”的函数即可。
class Invoice extnds \atk4\data\Model {
...
public $actions =[
'Active'=>['view','edit','delete','deactivate'],
'InActive'=>['view','edit','delete','activate'],
]
function init(){
parent::init();
...
$this->addFields([
['name'],
['username'],
['password'],
['joined_on','type'=>'date'],
['status','enum'=>array_keys($this->actions)], <== Here is your staus field
]);
...
}
...
function deactivate(){
$this['status']='InActive';
$this->save();
}
function activate(){
$this['status']='Active';
$this->save();
}
}
乐趣不止于此,有时你需要用户输入来执行某些操作,例如创建表单并在提交时进行某些操作。好吧,只需在任何/所有状态下定义一个更多的动作,并创建一个以 “page_” 为前缀的函数名,例如。
class Invoice extnds \atk4\data\Model {
...
public $actions =[
'Active'=>['view','edit','delete','deactivate','update_email'],
'InActive'=>['view','edit','delete','activate'],
]
...
function page_update_email($p){
$form = $p->add('Form');
$form->addField('email');
$form->onSubmit(function($f){
$this['email'] = $f->model['email'];
$this->save();
return "Updated"
});
}
}
这难道不有趣吗。我们正在努力开发下一个版本,以在页面功能中实现自动对话框关闭和 CRUD 重新加载。
目前,这只是初始提交,我们很快就会看到更多的更新。