0 关注者

类 yii\rbac\DbManager

继承关系yii\rbac\DbManager » yii\rbac\BaseManager » yii\base\Component » yii\base\BaseObject
实现接口yii\base\Configurable, yii\rbac\ManagerInterface
可用版本2.0
源代码 https://github.com/yiisoft/yii2/blob/master/framework/rbac/DbManager.php

DbManager 表示一个授权管理器,它将授权信息存储在数据库中。

数据库连接由 $db 指定。可以通过应用迁移来初始化数据库模式。

yii migrate --migrationPath=@yii/rbac/migrations/

如果您不想使用迁移并且需要 SQL 语句,则所有数据库的文件都位于迁移目录中。

您可以通过设置 $itemTable$itemChildTable$assignmentTable$ruleTable 来更改用于存储授权和规则数据的表名。

有关 DbManager 的更多详细信息和用法信息,请参阅 安全授权指南文章

公共属性

隐藏继承属性

属性 类型 描述 定义于
$assignmentTable string 存储授权项目分配的表名。 yii\rbac\DbManager
$behaviors yii\base\Behavior[] 附加到此组件的行为列表。 yii\base\Component
$cache yii\caching\CacheInterface|数组|字符串|null 用于提高 RBAC 性能的缓存。 yii\rbac\DbManager
$cacheKey string 用于在缓存中存储 RBAC 数据的键 yii\rbac\DbManager
$checkAccessAssignments array 用户分配(用户 ID => Assignment[]) yii\rbac\DbManager
$db yii\db\Connection|数组|字符串 DB 连接对象或 DB 连接的应用程序组件 ID。 yii\rbac\DbManager
$defaultRoleInstances yii\rbac\Role[] 默认角色。 yii\rbac\BaseManager
$defaultRoles array 无需调用 assign() 即可自动分配给每个用户的角色名称列表。 yii\rbac\BaseManager
$itemChildTable string 存储授权项目层次结构的表名。 yii\rbac\DbManager
$itemTable string 存储授权项目的表名。 yii\rbac\DbManager
$items yii\rbac\Item[] 所有授权项目(名称 => 项目) yii\rbac\DbManager
$parents array 授权项目父子关系(子名称 => 父级列表) yii\rbac\DbManager
$permissions yii\rbac\Permission[] 系统中的所有权限。 yii\rbac\BaseManager
$roles yii\rbac\Role[] 系统中的所有角色。 yii\rbac\BaseManager
$rolesCacheSuffix string 用于在缓存中存储用户 RBAC 角色的键 yii\rbac\DbManager
$ruleTable string 存储规则的表名。 yii\rbac\DbManager
$rules yii\rbac\Rule[] 所有授权规则(名称 => 规则) yii\rbac\DbManager

受保护属性

隐藏继承属性

属性 类型 描述 定义于

公共方法

隐藏继承方法

方法 描述 定义于
__call() 调用不是类方法的命名方法。 yii\base\Component
__clone() 此方法在通过克隆现有对象创建对象后调用。 yii\base\Component
__construct() 构造函数。 yii\base\BaseObject
__get() 返回组件属性的值。 yii\base\Component
__isset() 检查属性是否已设置,即定义且不为 null。 yii\base\Component
__set() 设置组件属性的值。 yii\base\Component
__unset() 将组件属性设置为 null。 yii\base\Component
add() 将角色、权限或规则添加到 RBAC 系统。 yii\rbac\BaseManager
addChild() 将一个项目添加为另一个项目的子项。 yii\rbac\DbManager
assign() 将角色分配给用户。 yii\rbac\DbManager
attachBehavior() 将行为附加到此组件。 yii\base\Component
attachBehaviors() 将行为列表附加到组件。 yii\base\Component
behaviors() 返回此组件应表现为的行为列表。 yii\base\Component
canAddChild() 检查是否可以向父级添加子级。 yii\rbac\DbManager
canGetProperty() 返回一个值,指示是否可以读取属性。 yii\base\Component
canSetProperty() 返回一个值,指示是否可以设置属性。 yii\base\Component
checkAccess() yii\rbac\DbManager
className() 返回此类的完全限定名称。 yii\base\BaseObject
createPermission() 创建一个新的 Permission 对象。 yii\rbac\BaseManager
createRole() 创建一个新的 Role 对象。 yii\rbac\BaseManager
detachBehavior() 从组件分离行为。 yii\base\Component
detachBehaviors() 从组件分离所有行为。 yii\base\Component
ensureBehaviors() 确保 behaviors() 中声明的行为已附加到此组件。 yii\base\Component
getAssignment() 返回有关角色和用户的分配信息。 yii\rbac\DbManager
getAssignments() 返回指定用户的全部角色分配信息。 yii\rbac\DbManager
getBehavior() 返回命名的行为对象。 yii\base\Component
getBehaviors() 返回附加到此组件的所有行为。 yii\base\Component
getChildRoles() 返回指定角色的子角色。深度不受限制。 yii\rbac\DbManager
getChildren() 返回子权限和/或角色。 yii\rbac\DbManager
getDefaultRoleInstances() 返回作为 Role 对象数组的 defaultRoles。 yii\rbac\BaseManager
getDefaultRoles() 获取默认角色 yii\rbac\BaseManager
getPermission() 返回命名的权限。 yii\rbac\BaseManager
getPermissions() 返回系统中的所有权限。 yii\rbac\BaseManager
getPermissionsByRole() 返回指定角色代表的所有权限。 yii\rbac\DbManager
getPermissionsByUser() 返回用户拥有的所有权限。 yii\rbac\DbManager
getRole() 返回命名的角色。 yii\rbac\BaseManager
getRoles() 返回系统中的所有角色。 yii\rbac\BaseManager
getRolesByUser() {@inheritdoc} 此方法返回的角色包括通过 $defaultRoles 分配的角色。 yii\rbac\DbManager
getRule() 返回指定名称的规则。 yii\rbac\DbManager
getRules() 返回系统中可用的所有规则。 yii\rbac\DbManager
getUserIdsByRole() 返回指定角色的所有角色分配信息。 yii\rbac\DbManager
hasChild() 返回一个值,指示子项是否已存在于父项中。 yii\rbac\DbManager
hasEventHandlers() 返回一个值,指示是否有任何处理程序附加到命名的事件。 yii\base\Component
hasMethod() 返回一个值,指示方法是否已定义。 yii\base\Component
hasProperty() 返回一个值,指示是否为该组件定义了属性。 yii\base\Component
init() 初始化应用程序组件。 yii\rbac\DbManager
invalidateCache() yii\rbac\DbManager
loadFromCache() yii\rbac\DbManager
off() 从此组件分离现有的事件处理程序。 yii\base\Component
on() 将事件处理程序附加到事件。 yii\base\Component
remove() 从 RBAC 系统中删除角色、权限或规则。 yii\rbac\BaseManager
removeAll() 删除所有授权数据,包括角色、权限、规则和分配。 yii\rbac\DbManager
removeAllAssignments() 删除所有角色分配。 yii\rbac\DbManager
removeAllPermissions() 删除所有权限。 yii\rbac\DbManager
removeAllRoles() 删除所有角色。 yii\rbac\DbManager
removeAllRules() 删除所有规则。 yii\rbac\DbManager
removeChild() 从其父级中删除子级。 yii\rbac\DbManager
removeChildren() 从其父级中删除所有子级。 yii\rbac\DbManager
revoke() 撤销用户的角色。 yii\rbac\DbManager
revokeAll() 撤销用户的全部角色。 yii\rbac\DbManager
setDefaultRoles() 设置默认角色 yii\rbac\BaseManager
trigger() 触发事件。 yii\base\Component
update() 更新系统中指定的角色、权限或规则。 yii\rbac\BaseManager

受保护方法

隐藏继承方法

方法 描述 定义于
addItem() 将授权项目添加到 RBAC 系统。 yii\rbac\DbManager
addRule() 将规则添加到 RBAC 系统。 yii\rbac\DbManager
checkAccessFromCache() 根据从缓存加载的数据执行指定用户的访问检查。 yii\rbac\DbManager
checkAccessRecursive() 执行指定用户的访问检查。 yii\rbac\DbManager
detectLoop() 检查授权项层次结构中是否存在循环。 yii\rbac\DbManager
executeRule() 执行与指定授权项关联的规则。 yii\rbac\BaseManager
getChildrenList() 返回每个父级的子级。 yii\rbac\DbManager
getChildrenRecursive() 递归查找指定项的所有子级和孙级。 yii\rbac\DbManager
getDirectPermissionsByUser() 返回直接分配给用户的全部权限。 yii\rbac\DbManager
getInheritedPermissionsByUser() 返回用户从分配给他的角色继承的全部权限。 yii\rbac\DbManager
getItem() 返回命名的授权项。 yii\rbac\DbManager
getItems() 返回指定类型的项。 yii\rbac\DbManager
hasNoAssignments() 检查数组 $assignments 是否为空,以及 $defaultRoles 属性是否也为空。 yii\rbac\BaseManager
isEmptyUserId() 检查 $userId 是否为空。 yii\rbac\DbManager
populateItem() 使用从数据库获取的数据填充授权项。 yii\rbac\DbManager
removeAllItems() 删除指定类型的全部授权项。 yii\rbac\DbManager
removeItem() 从 RBAC 系统中删除授权项。 yii\rbac\DbManager
removeRule() 从 RBAC 系统中删除规则。 yii\rbac\DbManager
supportsCascadeUpdate() 返回一个值,指示数据库是否支持级联更新和删除。 yii\rbac\DbManager
updateItem() 更新 RBAC 系统中的授权项。 yii\rbac\DbManager
updateRule() 将规则更新到 RBAC 系统。 yii\rbac\DbManager

属性详情

隐藏继承属性

$assignmentTable 公共属性

存储授权项分配的表的名称。默认为 "auth_assignment"。

public string $assignmentTable '{{%auth_assignment}}'
$cache 公共属性 (自版本 2.0.3 起可用)

用于提高 RBAC 性能的缓存。这可以是以下之一:

  • 一个应用程序组件 ID(例如 cache
  • 一个配置数组
  • 一个 yii\caching\Cache 对象

如果未设置,则表示未启用缓存。

请注意,通过启用 RBAC 缓存,所有授权项、规则和授权项父子关系都将被缓存并加载到内存中。这将提高 RBAC 权限检查的性能。但是,它确实需要额外的内存,因此如果您的 RBAC 系统包含太多授权项,则可能不合适。在这种情况下,您应该寻求其他 RBAC 实现(例如基于 Redis 存储的 RBAC)。

另请注意,如果您从此组件外部修改 RBAC 项、规则或父子关系,则必须手动调用 invalidateCache() 以确保数据一致性。

$cacheKey 公共属性 (自版本 2.0.3 起可用)

用于在缓存中存储 RBAC 数据的键

另请参见 $cache

public string $cacheKey 'rbac'
$checkAccessAssignments 受保护属性

用户分配(用户 ID => Assignment[])

$db 公共属性

DB 连接对象或 DB 连接的应用程序组件 ID。创建 DbManager 对象后,如果要更改此属性,则应仅将其分配给 DB 连接对象。从 2.0.2 版本开始,这也可以是用于创建对象的配置数组。

$itemChildTable 公共属性

存储授权项层次结构的表的名称。默认为 "auth_item_child"。

public string $itemChildTable '{{%auth_item_child}}'
$itemTable 公共属性

存储授权项的表的名称。默认为 "auth_item"。

public string $itemTable '{{%auth_item}}'
$items 受保护属性

所有授权项目(名称 => 项目)

protected yii\rbac\Item[] $items null
$parents 受保护属性

授权项目父子关系(子名称 => 父级列表)

protected array $parents null
$rolesCacheSuffix 公共属性 (自版本 2.0.48 起可用)

用于在缓存中存储用户 RBAC 角色的键

public string $rolesCacheSuffix 'roles'
$ruleTable 公共属性

存储规则的表的名称。默认为 "auth_rule"。

public string $ruleTable '{{%auth_rule}}'
$rules 受保护属性

所有授权规则(名称 => 规则)

protected yii\rbac\Rule[] $rules null

方法详情

隐藏继承方法

__call() 公共方法

定义于: yii\base\Component::__call()

调用不是类方法的命名方法。

此方法将检查任何附加的行为是否具有指定的方法,如果可用则执行它。

不要直接调用此方法,因为它是一个 PHP 魔术方法,当调用未知方法时会隐式调用。

public mixed __call ( $name, $params )
$name string

方法名

$params array

方法参数

返回值 mixed

方法返回值

抛出 yii\base\UnknownMethodException

调用未知方法时

                public function __call($name, $params)
{
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $object) {
        if ($object->hasMethod($name)) {
            return call_user_func_array([$object, $name], $params);
        }
    }
    throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}

            
__clone() 公共方法

定义于: yii\base\Component::__clone()

此方法在通过克隆现有对象创建对象后调用。

它删除所有行为,因为它们附加到旧对象。

public void __clone ( )

                public function __clone()
{
    $this->_events = [];
    $this->_eventWildcards = [];
    $this->_behaviors = null;
}

            
__construct() 公共方法

定义于: yii\base\BaseObject::__construct()

构造函数。

默认实现执行两件事

  • 使用给定的配置$config初始化对象。
  • 调用init()

如果此方法在子类中被重写,建议

  • 构造函数的最后一个参数是一个配置数组,像这里的$config一样。
  • 在构造函数的末尾调用父实现。
public void __construct ( $config = [] )
$config array

将用于初始化对象属性的键值对

                public function __construct($config = [])
{
    if (!empty($config)) {
        Yii::configure($this, $config);
    }
    $this->init();
}

            
__get() 公共方法

定义于: yii\base\Component::__get()

返回组件属性的值。

此方法将按以下顺序检查并相应地执行

  • 由 getter 定义的属性:返回 getter 结果
  • 行为的属性:返回行为属性值

不要直接调用此方法,因为它是一个 PHP 魔术方法,当执行$value = $component->property;时会隐式调用。

另请参阅__set()

public mixed __get ( $name )
$name string

属性名

返回值 mixed

属性值或行为属性的值

抛出 yii\base\UnknownPropertyException

如果属性未定义

抛出 yii\base\InvalidCallException

如果属性是只写属性。

                public function __get($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        // read property, e.g. getName()
        return $this->$getter();
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canGetProperty($name)) {
            return $behavior->$name;
        }
    }
    if (method_exists($this, 'set' . $name)) {
        throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
    }
    throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}

            
__isset() 公共方法

定义于: yii\base\Component::__isset()

检查属性是否已设置,即定义且不为 null。

此方法将按以下顺序检查并相应地执行

  • 由 setter 定义的属性:返回属性是否已设置
  • 行为的属性:返回属性是否已设置
  • 对于不存在的属性返回false

不要直接调用此方法,因为它是一个 PHP 魔术方法,当执行isset($component->property)时会隐式调用。

另请参阅https://php.ac.cn/manual/en/function.isset.php

public boolean __isset ( $name )
$name string

属性名或事件名

返回值 boolean

命名属性是否已设置

                public function __isset($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter() !== null;
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canGetProperty($name)) {
            return $behavior->$name !== null;
        }
    }
    return false;
}

            
__set() 公共方法

定义于: yii\base\Component::__set()

设置组件属性的值。

此方法将按以下顺序检查并相应地执行

  • 由 setter 定义的属性:设置属性值
  • “on xyz”格式的事件:将处理程序附加到“xyz”事件
  • “as xyz”格式的行为:附加名为“xyz”的行为
  • 行为的属性:设置行为属性值

不要直接调用此方法,因为它是一个 PHP 魔术方法,当执行$component->property = $value;时会隐式调用。

另请参阅__get()

public void __set ( $name, $value )
$name string

属性名或事件名

$value mixed

属性值

抛出 yii\base\UnknownPropertyException

如果属性未定义

抛出 yii\base\InvalidCallException

如果属性是只读属性。

                public function __set($name, $value)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        // set property
        $this->$setter($value);
        return;
    } elseif (strncmp($name, 'on ', 3) === 0) {
        // on event: attach event handler
        $this->on(trim(substr($name, 3)), $value);
        return;
    } elseif (strncmp($name, 'as ', 3) === 0) {
        // as behavior: attach behavior
        $name = trim(substr($name, 3));
        $this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));
        return;
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canSetProperty($name)) {
            $behavior->$name = $value;
            return;
        }
    }
    if (method_exists($this, 'get' . $name)) {
        throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
    }
    throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}

            
__unset() 公共方法

定义于: yii\base\Component::__unset()

将组件属性设置为 null。

此方法将按以下顺序检查并相应地执行

  • 由 setter 定义的属性:将属性值设置为 null
  • 行为的属性:将属性值设置为 null

不要直接调用此方法,因为它是一个 PHP 魔术方法,当执行unset($component->property)时会隐式调用。

另请参阅https://php.ac.cn/manual/en/function.unset.php

public void __unset ( $name )
$name string

属性名

抛出 yii\base\InvalidCallException

如果属性是只读属性。

                public function __unset($name)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        $this->$setter(null);
        return;
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canSetProperty($name)) {
            $behavior->$name = null;
            return;
        }
    }
    throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);
}

            
add() 公共方法

定义于: yii\rbac\BaseManager::add()

将角色、权限或规则添加到 RBAC 系统。

public boolean add ( $object )
$object yii\rbac\Role|yii\rbac\Permission|yii\rbac\Rule
返回值 boolean

角色、权限或规则是否已成功添加到系统中

抛出 异常

如果数据验证或保存失败(例如角色或权限的名称不唯一)

                public function add($object)
{
    if ($object instanceof Item) {
        if ($object->ruleName && $this->getRule($object->ruleName) === null) {
            $rule = \Yii::createObject($object->ruleName);
            $rule->name = $object->ruleName;
            $this->addRule($rule);
        }
        return $this->addItem($object);
    } elseif ($object instanceof Rule) {
        return $this->addRule($object);
    }
    throw new InvalidArgumentException('Adding unsupported object type.');
}

            
addChild() 公共方法

将一个项目添加为另一个项目的子项。

public boolean addChild ( $parent, $child )
$parent yii\rbac\Item
$child yii\rbac\Item
返回值 boolean

子项是否已成功添加

抛出 yii\base\Exception

如果父子关系已存在或检测到循环。

                public function addChild($parent, $child)
{
    if ($parent->name === $child->name) {
        throw new InvalidArgumentException("Cannot add '{$parent->name}' as a child of itself.");
    }
    if ($parent instanceof Permission && $child instanceof Role) {
        throw new InvalidArgumentException('Cannot add a role as a child of a permission.');
    }
    if ($this->detectLoop($parent, $child)) {
        throw new InvalidCallException("Cannot add '{$child->name}' as a child of '{$parent->name}'. A loop has been detected.");
    }
    $this->db->createCommand()
        ->insert($this->itemChildTable, ['parent' => $parent->name, 'child' => $child->name])
        ->execute();
    $this->invalidateCache();
    return true;
}

            
addItem() 受保护方法

将授权项目添加到 RBAC 系统。

protected boolean addItem ( $item )
$item yii\rbac\Item

要添加的项

返回值 boolean

授权项是否成功添加到系统中

抛出 异常

如果数据验证或保存失败(例如角色或权限的名称不唯一)

                protected function addItem($item)
{
    $time = time();
    if ($item->createdAt === null) {
        $item->createdAt = $time;
    }
    if ($item->updatedAt === null) {
        $item->updatedAt = $time;
    }
    $this->db->createCommand()
        ->insert($this->itemTable, [
            'name' => $item->name,
            'type' => $item->type,
            'description' => $item->description,
            'rule_name' => $item->ruleName,
            'data' => $item->data === null ? null : serialize($item->data),
            'created_at' => $item->createdAt,
            'updated_at' => $item->updatedAt,
        ])->execute();
    $this->invalidateCache();
    return true;
}

            
addRule() 受保护方法

将规则添加到 RBAC 系统。

protected 布尔型 addRule ( $rule )
$rule yii\rbac\Rule

要添加的规则

返回值 boolean

规则是否成功添加到系统中

抛出 异常

如果数据验证或保存失败(例如规则名称不唯一)

                protected function addRule($rule)
{
    $time = time();
    if ($rule->createdAt === null) {
        $rule->createdAt = $time;
    }
    if ($rule->updatedAt === null) {
        $rule->updatedAt = $time;
    }
    $this->db->createCommand()
        ->insert($this->ruleTable, [
            'name' => $rule->name,
            'data' => serialize($rule),
            'created_at' => $rule->createdAt,
            'updated_at' => $rule->updatedAt,
        ])->execute();
    $this->invalidateCache();
    return true;
}

            
assign() 公共方法

将角色分配给用户。

public yii\rbac\Assignment assign ( $role, $userId )
$role yii\rbac\Role|yii\rbac\Permission
$userId 字符串|整数

用户 ID(参见 yii\web\User::$id

返回值 yii\rbac\Assignment

角色分配信息。

抛出 异常

如果角色已分配给用户

                public function assign($role, $userId)
{
    $assignment = new Assignment([
        'userId' => $userId,
        'roleName' => $role->name,
        'createdAt' => time(),
    ]);
    $this->db->createCommand()
        ->insert($this->assignmentTable, [
            'user_id' => $assignment->userId,
            'item_name' => $assignment->roleName,
            'created_at' => $assignment->createdAt,
        ])->execute();
    unset($this->checkAccessAssignments[(string) $userId]);
    $this->invalidateCache();
    return $assignment;
}

            
attachBehavior() 公共方法

定义于: yii\base\Component::attachBehavior()

将行为附加到此组件。

此方法将根据给定的配置创建行为对象。之后,行为对象将通过调用 yii\base\Behavior::attach() 方法附加到此组件。

另请参阅 detachBehavior()

public yii\base\Behavior attachBehavior ( $name, $behavior )
$name string

行为的名称。

$behavior 字符串|数组|yii\base\Behavior

行为配置。可以是以下之一

返回值 yii\base\Behavior

行为对象

                public function attachBehavior($name, $behavior)
{
    $this->ensureBehaviors();
    return $this->attachBehaviorInternal($name, $behavior);
}

            
attachBehaviors() 公共方法

定义于: yii\base\Component::attachBehaviors()

将行为列表附加到组件。

每个行为都以其名称为索引,并且应该是一个 yii\base\Behavior 对象、一个指定行为类的字符串或一个用于创建行为的配置数组。

另请参阅 attachBehavior()

public void attachBehaviors ( $behaviors )
$behaviors array

要附加到组件的行为列表

                public function attachBehaviors($behaviors)
{
    $this->ensureBehaviors();
    foreach ($behaviors as $name => $behavior) {
        $this->attachBehaviorInternal($name, $behavior);
    }
}

            
behaviors() 公共方法

定义于: yii\base\Component::behaviors()

返回此组件应表现为的行为列表。

子类可以重写此方法以指定它们希望表现出的行为。

此方法的返回值应该是一个行为对象或配置的数组,以行为名称为索引。行为配置可以是指定行为类的字符串,也可以是以下结构的数组

'behaviorName' => [
    'class' => 'BehaviorClass',
    'property1' => 'value1',
    'property2' => 'value2',
]

请注意,行为类必须扩展自 yii\base\Behavior。可以使用名称或匿名方式附加行为。当数组键使用名称时,使用此名称,行为稍后可以使用 getBehavior() 检索,或使用 detachBehavior() 分离。匿名行为无法检索或分离。

此方法中声明的行为将自动附加到组件(按需)。

public 数组 behaviors ( )
返回值 array

行为配置。

                public function behaviors()
{
    return [];
}

            
canAddChild() 公共方法(自版本 2.0.8 起可用)

检查是否可以向父级添加子级。

public 布尔型 canAddChild ( $parent, $child )
$parent yii\rbac\Item

父项

$child yii\rbac\Item

要添加到层次结构中的子项

返回值 boolean

添加的可能性

                public function canAddChild($parent, $child)
{
    return !$this->detectLoop($parent, $child);
}

            
canGetProperty() 公共方法

定义于: yii\base\Component::canGetProperty()

返回一个值,指示是否可以读取属性。

如果可以读取属性

  • 该类具有与指定名称关联的 getter 方法(在这种情况下,属性名称不区分大小写);
  • 该类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);
  • 附加的行为具有给定名称的可读属性(当 $checkBehaviors 为 true 时)。

另请参阅 canSetProperty()

public 布尔型 canGetProperty ( $name, $checkVars true, $checkBehaviors true )
$name string

属性名

$checkVars boolean

是否将成员变量视为属性

$checkBehaviors boolean

是否将行为的属性视为此组件的属性

返回值 boolean

属性是否可读

                public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
{
    if (method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name)) {
        return true;
    } elseif ($checkBehaviors) {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->canGetProperty($name, $checkVars)) {
                return true;
            }
        }
    }
    return false;
}

            
canSetProperty() 公共方法

定义于: yii\base\Component::canSetProperty()

返回一个值,指示是否可以设置属性。

如果可以写入属性

  • 该类具有与指定名称关联的 setter 方法(在这种情况下,属性名称不区分大小写);
  • 该类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);
  • 附加的行为具有给定名称的可写属性(当 $checkBehaviors 为 true 时)。

另请参阅 canGetProperty()

public 布尔型 canSetProperty ( $name, $checkVars true, $checkBehaviors true )
$name string

属性名

$checkVars boolean

是否将成员变量视为属性

$checkBehaviors boolean

是否将行为的属性视为此组件的属性

返回值 boolean

属性是否可写

                public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
{
    if (method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name)) {
        return true;
    } elseif ($checkBehaviors) {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->canSetProperty($name, $checkVars)) {
                return true;
            }
        }
    }
    return false;
}

            
checkAccess() 公共方法

public void checkAccess ( $userId, $permissionName, $params = [] )
$userId
$permissionName
$params

                public function checkAccess($userId, $permissionName, $params = [])
{
    if (isset($this->checkAccessAssignments[(string) $userId])) {
        $assignments = $this->checkAccessAssignments[(string) $userId];
    } else {
        $assignments = $this->getAssignments($userId);
        $this->checkAccessAssignments[(string) $userId] = $assignments;
    }
    if ($this->hasNoAssignments($assignments)) {
        return false;
    }
    $this->loadFromCache();
    if ($this->items !== null) {
        return $this->checkAccessFromCache($userId, $permissionName, $params, $assignments);
    }
    return $this->checkAccessRecursive($userId, $permissionName, $params, $assignments);
}

            
checkAccessFromCache() 受保护方法(自版本 2.0.3 起可用)

根据从缓存加载的数据执行指定用户的访问检查。

$cache 已启用时,此方法由 checkAccess() 内部调用。

受保护 布尔型 checkAccessFromCache ( $user, $itemName, $params, $assignments )
$user 字符串|整数

用户 ID。可以是整数,也可以是表示用户唯一标识符的字符串。参见 yii\web\User::$id

$itemName string

需要进行访问检查的操作名称

$params array

将传递给与用户分配的任务和角色关联的规则的名称-值对。在此数组中添加了一个名为“user”的参数,其中包含$userId的值。

$assignments yii\rbac\Assignment[]

指定用户的分配

返回值 boolean

用户是否可以执行操作。

                protected function checkAccessFromCache($user, $itemName, $params, $assignments)
{
    if (!isset($this->items[$itemName])) {
        return false;
    }
    $item = $this->items[$itemName];
    Yii::debug($item instanceof Role ? "Checking role: $itemName" : "Checking permission: $itemName", __METHOD__);
    if (!$this->executeRule($user, $item, $params)) {
        return false;
    }
    if (isset($assignments[$itemName]) || in_array($itemName, $this->defaultRoles)) {
        return true;
    }
    if (!empty($this->parents[$itemName])) {
        foreach ($this->parents[$itemName] as $parent) {
            if ($this->checkAccessFromCache($user, $parent, $params, $assignments)) {
                return true;
            }
        }
    }
    return false;
}

            
checkAccessRecursive() 受保护方法

执行指定用户的访问检查。

此方法由 checkAccess() 内部调用。

受保护 布尔型 checkAccessRecursive ( $user, $itemName, $params, $assignments )
$user 字符串|整数

用户 ID。可以是整数,也可以是表示用户唯一标识符的字符串。参见 yii\web\User::$id

$itemName string

需要进行访问检查的操作名称

$params array

将传递给与用户分配的任务和角色关联的规则的名称-值对。在此数组中添加了一个名为“user”的参数,其中包含$userId的值。

$assignments yii\rbac\Assignment[]

指定用户的分配

返回值 boolean

用户是否可以执行操作。

                protected function checkAccessRecursive($user, $itemName, $params, $assignments)
{
    if (($item = $this->getItem($itemName)) === null) {
        return false;
    }
    Yii::debug($item instanceof Role ? "Checking role: $itemName" : "Checking permission: $itemName", __METHOD__);
    if (!$this->executeRule($user, $item, $params)) {
        return false;
    }
    if (isset($assignments[$itemName]) || in_array($itemName, $this->defaultRoles)) {
        return true;
    }
    $query = new Query();
    $parents = $query->select(['parent'])
        ->from($this->itemChildTable)
        ->where(['child' => $itemName])
        ->column($this->db);
    foreach ($parents as $parent) {
        if ($this->checkAccessRecursive($user, $parent, $params, $assignments)) {
            return true;
        }
    }
    return false;
}

            
className() 公共静态方法
自 2.0.14 版起已弃用。在 PHP >= 5.5 上,请改用 ::class

定义于: yii\base\BaseObject::className()

返回此类的完全限定名称。

公共静态 字符串 className ( )
返回值 string

此类的完全限定名称。

                public static function className()
{
    return get_called_class();
}

            
createPermission() 公共方法

定义于: yii\rbac\BaseManager::createPermission()

创建一个新的 Permission 对象。

请注意,新创建的权限尚未添加到 RBAC 系统中。您必须填写所需的数据并调用 add() 以将其添加到系统中。

公共 yii\rbac\Permission createPermission ( $name )
$name string

权限名称

返回值 yii\rbac\Permission

新的 Permission 对象

                public function createPermission($name)
{
    $permission = new Permission();
    $permission->name = $name;
    return $permission;
}

            
createRole() 公共方法

定义于: yii\rbac\BaseManager::createRole()

创建一个新的 Role 对象。

请注意,新创建的角色尚未添加到 RBAC 系统中。您必须填写所需的数据并调用 add() 以将其添加到系统中。

公共 yii\rbac\Role createRole ( $name )
$name string

角色名称

返回值 yii\rbac\Role

新的 Role 对象

                public function createRole($name)
{
    $role = new Role();
    $role->name = $name;
    return $role;
}

            
detachBehavior() 公共方法

定义于: yii\base\Component::detachBehavior()

从组件分离行为。

将调用行为的 yii\base\Behavior::detach() 方法。

公共 yii\base\Behavior| detachBehavior ( $name )
$name string

行为的名称。

返回值 yii\base\Behavior|

已分离的行为。如果行为不存在,则为 null。

                public function detachBehavior($name)
{
    $this->ensureBehaviors();
    if (isset($this->_behaviors[$name])) {
        $behavior = $this->_behaviors[$name];
        unset($this->_behaviors[$name]);
        $behavior->detach();
        return $behavior;
    }
    return null;
}

            
detachBehaviors() 公共方法

定义于: yii\base\Component::detachBehaviors()

从组件分离所有行为。

公共 detachBehaviors ( )

                public function detachBehaviors()
{
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $name => $behavior) {
        $this->detachBehavior($name);
    }
}

            
detectLoop() 受保护方法

检查授权项层次结构中是否存在循环。

受保护 布尔型 detectLoop ( $parent, $child )
$parent yii\rbac\Item

父项

$child yii\rbac\Item

要添加到层次结构中的子项

返回值 boolean

是否存在循环

                protected function detectLoop($parent, $child)
{
    if ($child->name === $parent->name) {
        return true;
    }
    foreach ($this->getChildren($child->name) as $grandchild) {
        if ($this->detectLoop($parent, $grandchild)) {
            return true;
        }
    }
    return false;
}

            
ensureBehaviors() 公共方法

定义于: yii\base\Component::ensureBehaviors()

确保 behaviors() 中声明的行为已附加到此组件。

公共 ensureBehaviors ( )

                public function ensureBehaviors()
{
    if ($this->_behaviors === null) {
        $this->_behaviors = [];
        foreach ($this->behaviors() as $name => $behavior) {
            $this->attachBehaviorInternal($name, $behavior);
        }
    }
}

            
executeRule() 受保护方法

定义于: yii\rbac\BaseManager::executeRule()

执行与指定授权项关联的规则。

如果项目未指定规则,则此方法将返回 true。否则,它将返回 yii\rbac\Rule::execute() 的值。

受保护 布尔型 executeRule ( $user, $item, $params )
$user 字符串|整数

用户 ID。可以是整数,也可以是表示用户唯一标识符的字符串。参见 yii\web\User::$id

$item yii\rbac\Item

需要执行其规则的权限项

$params array

传递给 yii\rbac\CheckAccessInterface::checkAccess() 的参数,并将传递给规则

返回值 boolean

yii\rbac\Rule::execute() 的返回值。如果权限项未指定规则,则将返回 true。

抛出 yii\base\InvalidConfigException

如果权限项具有无效规则。

                protected function executeRule($user, $item, $params)
{
    if ($item->ruleName === null) {
        return true;
    }
    $rule = $this->getRule($item->ruleName);
    if ($rule instanceof Rule) {
        return $rule->execute($user, $item, $params);
    }
    throw new InvalidConfigException("Rule not found: {$item->ruleName}");
}

            
getAssignment() 公共方法

返回有关角色和用户的分配信息。

公共 yii\rbac\Assignment| getAssignment ( $roleName, $userId )
$roleName string

角色名称

$userId 字符串|整数

用户 ID(参见 yii\web\User::$id

返回值 yii\rbac\Assignment|

分配信息。如果角色未分配给用户,则返回 null。

                public function getAssignment($roleName, $userId)
{
    if ($this->isEmptyUserId($userId)) {
        return null;
    }
    $row = (new Query())->from($this->assignmentTable)
        ->where(['user_id' => (string) $userId, 'item_name' => $roleName])
        ->one($this->db);
    if ($row === false) {
        return null;
    }
    return new Assignment([
        'userId' => $row['user_id'],
        'roleName' => $row['item_name'],
        'createdAt' => $row['created_at'],
    ]);
}

            
getAssignments() 公共方法

返回指定用户的全部角色分配信息。

公共 yii\rbac\Assignment[] getAssignments ( $userId )
$userId 字符串|整数

用户 ID(参见 yii\web\User::$id

返回值 yii\rbac\Assignment[]

以角色名称为索引的分配。如果用户没有分配任何角色,则将返回一个空数组。

                public function getAssignments($userId)
{
    if ($this->isEmptyUserId($userId)) {
        return [];
    }
    $query = (new Query())
        ->from($this->assignmentTable)
        ->where(['user_id' => (string) $userId]);
    $assignments = [];
    foreach ($query->all($this->db) as $row) {
        $assignments[$row['item_name']] = new Assignment([
            'userId' => $row['user_id'],
            'roleName' => $row['item_name'],
            'createdAt' => $row['created_at'],
        ]);
    }
    return $assignments;
}

            
getBehavior() 公共方法

定义于: yii\base\Component::getBehavior()

返回命名的行为对象。

public yii\base\Behavior|null getBehavior ( $name )
$name string

行为名称

返回值 yii\base\Behavior|

行为对象,如果行为不存在则为 null

                public function getBehavior($name)
{
    $this->ensureBehaviors();
    return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}

            
getBehaviors() 公共方法

定义于: yii\base\Component::getBehaviors()

返回附加到此组件的所有行为。

public yii\base\Behavior[] getBehaviors ( )
返回值 yii\base\Behavior[]

附加到此组件的行为列表

                public function getBehaviors()
{
    $this->ensureBehaviors();
    return $this->_behaviors;
}

            
getChildRoles() 公共方法 (自版本 2.0.10 起可用)

返回指定角色的子角色。深度不受限制。

public yii\rbac\Role[] getChildRoles ( $roleName )
$roleName string

要为其查找子角色的角色名称

返回值 yii\rbac\Role[]

子角色。数组以角色名称为索引。第一个元素是父角色本身的实例。

抛出 yii\base\InvalidParamException

如果未找到通过 $roleName 获取的角色

                public function getChildRoles($roleName)
{
    $role = $this->getRole($roleName);
    if ($role === null) {
        throw new InvalidArgumentException("Role \"$roleName\" not found.");
    }
    $result = [];
    $this->getChildrenRecursive($roleName, $this->getChildrenList(), $result);
    $roles = [$roleName => $role];
    $roles += array_filter($this->getRoles(), function (Role $roleItem) use ($result) {
        return array_key_exists($roleItem->name, $result);
    });
    return $roles;
}

            
getChildren() 公共方法

返回子权限和/或角色。

public yii\rbac\Item[] getChildren ( $name )
$name string

父项名称

返回值 yii\rbac\Item[]

子权限和/或角色

                public function getChildren($name)
{
    $query = (new Query())
        ->select(['name', 'type', 'description', 'rule_name', 'data', 'created_at', 'updated_at'])
        ->from([$this->itemTable, $this->itemChildTable])
        ->where(['parent' => $name, 'name' => new Expression('[[child]]')]);
    $children = [];
    foreach ($query->all($this->db) as $row) {
        $children[$row['name']] = $this->populateItem($row);
    }
    return $children;
}

            
getChildrenList() 受保护方法

返回每个父级的子级。

protected array getChildrenList ( )
返回值 array

子项列表。每个数组键都是父项名称,相应的数组值是子项名称列表。

                protected function getChildrenList()
{
    $query = (new Query())->from($this->itemChildTable);
    $parents = [];
    foreach ($query->all($this->db) as $row) {
        $parents[$row['parent']][] = $row['child'];
    }
    return $parents;
}

            
getChildrenRecursive() 受保护方法

递归查找指定项的所有子级和孙级。

protected void getChildrenRecursive ( $name, $childrenList, &$result )
$name string

要查找其子项的项的名称。

$childrenList array

通过 getChildrenList() 构建的子项列表

$result array

子项和孙项(在数组键中)

                protected function getChildrenRecursive($name, $childrenList, &$result)
{
    if (isset($childrenList[$name])) {
        foreach ($childrenList[$name] as $child) {
            $result[$child] = true;
            $this->getChildrenRecursive($child, $childrenList, $result);
        }
    }
}

            
getDefaultRoleInstances() 公共方法 (自版本 2.0.12 起可用)

定义于: yii\rbac\BaseManager::getDefaultRoleInstances()

返回作为 Role 对象数组的 defaultRoles。

public yii\rbac\Role[] getDefaultRoleInstances ( )
返回值 yii\rbac\Role[]

默认角色。数组以角色名称为索引

                public function getDefaultRoleInstances()
{
    $result = [];
    foreach ($this->defaultRoles as $roleName) {
        $result[$roleName] = $this->createRole($roleName);
    }
    return $result;
}

            
getDefaultRoles() 公共方法 (自版本 2.0.14 起可用)

定义于: yii\rbac\BaseManager::getDefaultRoles()

获取默认角色

public string[] getDefaultRoles ( )
返回值 string[]

默认角色

                public function getDefaultRoles()
{
    return $this->defaultRoles;
}

            
getDirectPermissionsByUser() 受保护方法 (自版本 2.0.7 起可用)

返回直接分配给用户的全部权限。

protected yii\rbac\Permission[] getDirectPermissionsByUser ( $userId )
$userId 字符串|整数

用户 ID(参见 yii\web\User::$id

返回值 yii\rbac\Permission[]

用户具有的所有直接权限。数组以权限名称为索引。

                protected function getDirectPermissionsByUser($userId)
{
    $query = (new Query())->select('b.*')
        ->from(['a' => $this->assignmentTable, 'b' => $this->itemTable])
        ->where('{{a}}.[[item_name]]={{b}}.[[name]]')
        ->andWhere(['a.user_id' => (string) $userId])
        ->andWhere(['b.type' => Item::TYPE_PERMISSION]);
    $permissions = [];
    foreach ($query->all($this->db) as $row) {
        $permissions[$row['name']] = $this->populateItem($row);
    }
    return $permissions;
}

            
getInheritedPermissionsByUser() 受保护方法 (自版本 2.0.7 起可用)

返回用户从分配给他的角色继承的全部权限。

protected yii\rbac\Permission[] getInheritedPermissionsByUser ( $userId )
$userId 字符串|整数

用户 ID(参见 yii\web\User::$id

返回值 yii\rbac\Permission[]

用户具有的所有继承权限。数组以权限名称为索引。

                protected function getInheritedPermissionsByUser($userId)
{
    $query = (new Query())->select('item_name')
        ->from($this->assignmentTable)
        ->where(['user_id' => (string) $userId]);
    $childrenList = $this->getChildrenList();
    $result = [];
    foreach ($query->column($this->db) as $roleName) {
        $this->getChildrenRecursive($roleName, $childrenList, $result);
    }
    if (empty($result)) {
        return [];
    }
    $query = (new Query())->from($this->itemTable)->where([
        'type' => Item::TYPE_PERMISSION,
        'name' => array_keys($result),
    ]);
    $permissions = [];
    foreach ($query->all($this->db) as $row) {
        $permissions[$row['name']] = $this->populateItem($row);
    }
    return $permissions;
}

            
getItem() 受保护方法

返回命名的授权项。

protected yii\rbac\Item|null getItem ( $name )
$name string

授权项名称。

返回值 yii\rbac\Item|null

与指定名称对应的授权项。如果不存在此项,则返回 Null。

                protected function getItem($name)
{
    if (empty($name)) {
        return null;
    }
    if (!empty($this->items[$name])) {
        return $this->items[$name];
    }
    $row = (new Query())->from($this->itemTable)
        ->where(['name' => $name])
        ->one($this->db);
    if ($row === false) {
        return null;
    }
    return $this->populateItem($row);
}

            
getItems() 受保护方法

返回指定类型的项。

protected yii\rbac\Item[] getItems ( $type )
$type integer

授权项类型(yii\rbac\Item::TYPE_ROLEyii\rbac\Item::TYPE_PERMISSION

返回值 yii\rbac\Item[]

指定类型的授权项。

                protected function getItems($type)
{
    $query = (new Query())
        ->from($this->itemTable)
        ->where(['type' => $type]);
    $items = [];
    foreach ($query->all($this->db) as $row) {
        $items[$row['name']] = $this->populateItem($row);
    }
    return $items;
}

            
getPermission() 公共方法

定义于: yii\rbac\BaseManager::getPermission()

返回命名的权限。

public yii\rbac\Permission|null getPermission ( $name )
$name string

权限名称。

返回值 yii\rbac\Permission|null

与指定名称对应的权限。如果不存在此权限,则返回 Null。

                public function getPermission($name)
{
    $item = $this->getItem($name);
    return $item instanceof Item && $item->type == Item::TYPE_PERMISSION ? $item : null;
}

            
getPermissions() 公共方法

定义于: yii\rbac\BaseManager::getPermissions()

返回系统中的所有权限。

public yii\rbac\Permission[] getPermissions ( )
返回值 yii\rbac\Permission[]

系统中的所有权限。数组的键名为权限名称。

                public function getPermissions()
{
    return $this->getItems(Item::TYPE_PERMISSION);
}

            
getPermissionsByRole() 公共方法

返回指定角色代表的所有权限。

public yii\rbac\Permission[] getPermissionsByRole ( $roleName )
$roleName string

角色名称

返回值 yii\rbac\Permission[]

角色所代表的所有权限。数组的键名为权限名称。

                public function getPermissionsByRole($roleName)
{
    $childrenList = $this->getChildrenList();
    $result = [];
    $this->getChildrenRecursive($roleName, $childrenList, $result);
    if (empty($result)) {
        return [];
    }
    $query = (new Query())->from($this->itemTable)->where([
        'type' => Item::TYPE_PERMISSION,
        'name' => array_keys($result),
    ]);
    $permissions = [];
    foreach ($query->all($this->db) as $row) {
        $permissions[$row['name']] = $this->populateItem($row);
    }
    return $permissions;
}

            
getPermissionsByUser() 公共方法

返回用户拥有的所有权限。

public yii\rbac\Permission[] getPermissionsByUser ( $userId )
$userId 字符串|整数

用户 ID(参见 yii\web\User::$id

返回值 yii\rbac\Permission[]

用户拥有的所有权限。数组的键名为权限名称。

                public function getPermissionsByUser($userId)
{
    if ($this->isEmptyUserId($userId)) {
        return [];
    }
    $directPermission = $this->getDirectPermissionsByUser($userId);
    $inheritedPermission = $this->getInheritedPermissionsByUser($userId);
    return array_merge($directPermission, $inheritedPermission);
}

            
getRole() 公共方法

定义于: yii\rbac\BaseManager::getRole()

返回命名的角色。

public yii\rbac\Role|null getRole ( $name )
$name string

角色名称。

返回值 yii\rbac\Role|null

对应于指定名称的角色。如果不存在这样的角色,则返回 Null。

                public function getRole($name)
{
    $item = $this->getItem($name);
    return $item instanceof Item && $item->type == Item::TYPE_ROLE ? $item : null;
}

            
getRoles() 公共方法

定义于: yii\rbac\BaseManager::getRoles()

返回系统中的所有角色。

public yii\rbac\Role[] getRoles ( )
返回值 yii\rbac\Role[]

系统中的所有角色。数组的键名为角色名称。

                public function getRoles()
{
    return $this->getItems(Item::TYPE_ROLE);
}

            
getRolesByUser() 公共方法

{@inheritdoc} 此方法返回的角色包括通过 $defaultRoles 分配的角色。

public void getRolesByUser ( $userId )
$userId

                public function getRolesByUser($userId)
{
    if ($this->isEmptyUserId($userId)) {
        return [];
    }
    if ($this->cache !== null) {
        $data = $this->cache->get($this->getUserRolesCacheKey($userId));
        if ($data !== false) {
            return $data;
        }
    }
    $query = (new Query())->select('b.*')
        ->from(['a' => $this->assignmentTable, 'b' => $this->itemTable])
        ->where('{{a}}.[[item_name]]={{b}}.[[name]]')
        ->andWhere(['a.user_id' => (string) $userId])
        ->andWhere(['b.type' => Item::TYPE_ROLE]);
    $roles = $this->getDefaultRoleInstances();
    foreach ($query->all($this->db) as $row) {
        $roles[$row['name']] = $this->populateItem($row);
    }
    if ($this->cache !== null) {
        $this->cacheUserRolesData($userId, $roles);
    }
    return $roles;
}

            
getRule() 公共方法

返回指定名称的规则。

public yii\rbac\Rule|null getRule ( $name )
$name string

规则名称

返回值 yii\rbac\Rule|null

规则对象,如果指定的名称不对应于任何规则,则返回 null。

                public function getRule($name)
{
    if ($this->rules !== null) {
        return isset($this->rules[$name]) ? $this->rules[$name] : null;
    }
    $row = (new Query())->select(['data'])
        ->from($this->ruleTable)
        ->where(['name' => $name])
        ->one($this->db);
    if ($row === false) {
        return null;
    }
    $data = $row['data'];
    if (is_resource($data)) {
        $data = stream_get_contents($data);
    }
    if (!$data) {
        return null;
    }
    return unserialize($data);
}

            
getRules() 公共方法

返回系统中可用的所有规则。

public yii\rbac\Rule[] getRules ( )
返回值 yii\rbac\Rule[]

规则,以规则名称为索引。

                public function getRules()
{
    if ($this->rules !== null) {
        return $this->rules;
    }
    $query = (new Query())->from($this->ruleTable);
    $rules = [];
    foreach ($query->all($this->db) as $row) {
        $data = $row['data'];
        if (is_resource($data)) {
            $data = stream_get_contents($data);
        }
        if ($data) {
            $rules[$row['name']] = unserialize($data);
        }
    }
    return $rules;
}

            
getUserIdsByRole() 公共方法 (自版本 2.0.7 起可用)

返回指定角色的所有角色分配信息。

public string[] getUserIdsByRole ( $roleName )
$roleName string
返回值 string[]

ID。如果角色未分配给任何用户,则返回空数组。

                public function getUserIdsByRole($roleName)
{
    if (empty($roleName)) {
        return [];
    }
    return (new Query())->select('[[user_id]]')
        ->from($this->assignmentTable)
        ->where(['item_name' => $roleName])->column($this->db);
}

            
hasChild() 公共方法

返回一个值,指示子项是否已存在于父项中。

public boolean hasChild ( $parent, $child )
$parent yii\rbac\Item
$child yii\rbac\Item
返回值 boolean

$child 是否已经是 $parent 的子项。

                public function hasChild($parent, $child)
{
    return (new Query())
        ->from($this->itemChildTable)
        ->where(['parent' => $parent->name, 'child' => $child->name])
        ->one($this->db) !== false;
}

            
hasEventHandlers() 公共方法

定义于: yii\base\Component::hasEventHandlers()

返回一个值,指示是否有任何处理程序附加到命名的事件。

public boolean hasEventHandlers ( $name )
$name string

事件名称

返回值 boolean

事件是否已附加任何处理程序。

                public function hasEventHandlers($name)
{
    $this->ensureBehaviors();
    if (!empty($this->_events[$name])) {
        return true;
    }
    foreach ($this->_eventWildcards as $wildcard => $handlers) {
        if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) {
            return true;
        }
    }
    return Event::hasHandlers($this, $name);
}

            
hasMethod() 公共方法

定义于: yii\base\Component::hasMethod()

返回一个值,指示方法是否已定义。

如果以下条件成立,则定义了方法

  • 类具有指定名称的方法
  • 附加的行为具有给定名称的方法(当 $checkBehaviors 为 true 时)。
public boolean hasMethod ( $name, $checkBehaviors true )
$name string

属性名

$checkBehaviors boolean

是否将行为的方法视为此组件的方法

返回值 boolean

方法是否已定义

                public function hasMethod($name, $checkBehaviors = true)
{
    if (method_exists($this, $name)) {
        return true;
    } elseif ($checkBehaviors) {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->hasMethod($name)) {
                return true;
            }
        }
    }
    return false;
}

            
hasNoAssignments() 受保护方法 (自版本 2.0.11 起可用)

定义于: yii\rbac\BaseManager::hasNoAssignments()

检查数组 $assignments 是否为空,以及 $defaultRoles 属性是否也为空。

protected boolean hasNoAssignments ( array $assignments )
$assignments yii\rbac\Assignment[]

用户分配的数组

返回值 boolean

$assignments 数组是否为空,以及 $defaultRoles 属性是否也为空

                protected function hasNoAssignments(array $assignments)
{
    return empty($assignments) && empty($this->defaultRoles);
}

            
hasProperty() 公共方法

定义于: yii\base\Component::hasProperty()

返回一个值,指示是否为该组件定义了属性。

如果以下条件成立,则定义了属性

  • 类具有与指定名称关联的 getter 或 setter 方法(在这种情况下,属性名称不区分大小写);
  • 该类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);
  • 附加的行为具有给定名称的属性(当 $checkBehaviors 为 true 时)。

另请参阅

public boolean hasProperty ( $name, $checkVars true, $checkBehaviors true )
$name string

属性名

$checkVars boolean

是否将成员变量视为属性

$checkBehaviors boolean

是否将行为的属性视为此组件的属性

返回值 boolean

属性是否已定义

                public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
    return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}

            
init() 公有方法

初始化应用程序组件。

此方法通过建立数据库连接覆盖父类的实现。

public void init ( )

                public function init()
{
    parent::init();
    $this->db = Instance::ensure($this->db, Connection::className());
    if ($this->cache !== null) {
        $this->cache = Instance::ensure($this->cache, 'yii\caching\CacheInterface');
    }
}

            
invalidateCache() 公有方法

public void invalidateCache ( )

                public function invalidateCache()
{
    if ($this->cache !== null) {
        $this->cache->delete($this->cacheKey);
        $this->items = null;
        $this->rules = null;
        $this->parents = null;
        $cachedUserIds = $this->cache->get($this->getUserRolesCachedSetKey());
        if ($cachedUserIds !== false) {
            foreach ($cachedUserIds as $userId) {
                $this->cache->delete($this->getUserRolesCacheKey($userId));
            }
            $this->cache->delete($this->getUserRolesCachedSetKey());
        }
    }
    $this->checkAccessAssignments = [];
}

            
isEmptyUserId() 受保护方法 (自 2.0.26 版本起可用)

检查 $userId 是否为空。

protected 布尔型 isEmptyUserId ( $userId )
$userId mixed

                protected function isEmptyUserId($userId)
{
    return !isset($userId) || $userId === '';
}

            
loadFromCache() 公有方法

public void loadFromCache ( )

                public function loadFromCache()
{
    if ($this->items !== null || !$this->cache instanceof CacheInterface) {
        return;
    }
    $data = $this->cache->get($this->cacheKey);
    if (is_array($data) && isset($data[0], $data[1], $data[2])) {
        list($this->items, $this->rules, $this->parents) = $data;
        return;
    }
    $query = (new Query())->from($this->itemTable);
    $this->items = [];
    foreach ($query->all($this->db) as $row) {
        $this->items[$row['name']] = $this->populateItem($row);
    }
    $query = (new Query())->from($this->ruleTable);
    $this->rules = [];
    foreach ($query->all($this->db) as $row) {
        $data = $row['data'];
        if (is_resource($data)) {
            $data = stream_get_contents($data);
        }
        if ($data) {
            $this->rules[$row['name']] = unserialize($data);
        }
    }
    $query = (new Query())->from($this->itemChildTable);
    $this->parents = [];
    foreach ($query->all($this->db) as $row) {
        if (isset($this->items[$row['child']])) {
            $this->parents[$row['child']][] = $row['parent'];
        }
    }
    $this->cache->set($this->cacheKey, [$this->items, $this->rules, $this->parents]);
}

            
off() 公有方法

定义于: yii\base\Component::off()

从此组件分离现有的事件处理程序。

此方法是 on() 的反向操作。

注意:如果为事件名称传递了通配符模式,则只会删除使用此通配符注册的处理程序,而使用与该通配符匹配的普通名称注册的处理程序将保留。

另请参阅 on()

public 布尔型 off ( $name, $handler null )
$name string

事件名称

$handler 可调用|

要删除的事件处理程序。如果为 null,则将删除附加到命名事件的所有处理程序。

返回值 boolean

如果找到并分离了处理程序

                public function off($name, $handler = null)
{
    $this->ensureBehaviors();
    if (empty($this->_events[$name]) && empty($this->_eventWildcards[$name])) {
        return false;
    }
    if ($handler === null) {
        unset($this->_events[$name], $this->_eventWildcards[$name]);
        return true;
    }
    $removed = false;
    // plain event names
    if (isset($this->_events[$name])) {
        foreach ($this->_events[$name] as $i => $event) {
            if ($event[0] === $handler) {
                unset($this->_events[$name][$i]);
                $removed = true;
            }
        }
        if ($removed) {
            $this->_events[$name] = array_values($this->_events[$name]);
            return true;
        }
    }
    // wildcard event names
    if (isset($this->_eventWildcards[$name])) {
        foreach ($this->_eventWildcards[$name] as $i => $event) {
            if ($event[0] === $handler) {
                unset($this->_eventWildcards[$name][$i]);
                $removed = true;
            }
        }
        if ($removed) {
            $this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
            // remove empty wildcards to save future redundant regex checks:
            if (empty($this->_eventWildcards[$name])) {
                unset($this->_eventWildcards[$name]);
            }
        }
    }
    return $removed;
}

            
on() 公有方法

定义于: yii\base\Component::on()

将事件处理程序附加到事件。

事件处理程序必须是有效的 PHP 回调。以下是一些示例

function ($event) { ... }         // anonymous function
[$object, 'handleClick']          // $object->handleClick()
['Page', 'handleClick']           // Page::handleClick()
'handleClick'                     // global function handleClick()

事件处理程序必须使用以下签名定义,

function ($event)

其中$event 是一个 yii\base\Event 对象,其中包含与事件关联的参数。

从 2.0.14 开始,您可以将事件名称指定为通配符模式

$component->on('event.group.*', function ($event) {
    Yii::trace($event->name . ' is triggered.');
});

另请参阅 off()

public void on ( $name, $handler, $data null, $append true )
$name string

事件名称

$handler 可调用

事件处理程序

$data mixed

触发事件时要传递给事件处理程序的数据。调用事件处理程序时,可以通过 yii\base\Event::$data 访问此数据。

$append boolean

是否将新的事件处理程序追加到现有处理程序列表的末尾。如果为 false,则新的处理程序将插入到现有处理程序列表的开头。

                public function on($name, $handler, $data = null, $append = true)
{
    $this->ensureBehaviors();
    if (strpos($name, '*') !== false) {
        if ($append || empty($this->_eventWildcards[$name])) {
            $this->_eventWildcards[$name][] = [$handler, $data];
        } else {
            array_unshift($this->_eventWildcards[$name], [$handler, $data]);
        }
        return;
    }
    if ($append || empty($this->_events[$name])) {
        $this->_events[$name][] = [$handler, $data];
    } else {
        array_unshift($this->_events[$name], [$handler, $data]);
    }
}

            
populateItem() 受保护方法

使用从数据库获取的数据填充授权项。

protected yii\rbac\Item populateItem ( $row )
$row array

来自授权项表的 数据

返回值 yii\rbac\Item

填充的授权项实例(角色或权限)

                protected function populateItem($row)
{
    $class = $row['type'] == Item::TYPE_PERMISSION ? Permission::className() : Role::className();
    if (!isset($row['data']) || ($data = @unserialize(is_resource($row['data']) ? stream_get_contents($row['data']) : $row['data'])) === false) {
        $data = null;
    }
    return new $class([
        'name' => $row['name'],
        'type' => $row['type'],
        'description' => $row['description'],
        'ruleName' => $row['rule_name'] ?: null,
        'data' => $data,
        'createdAt' => $row['created_at'],
        'updatedAt' => $row['updated_at'],
    ]);
}

            
remove() 公有方法

定义于: yii\rbac\BaseManager::remove()

从 RBAC 系统中删除角色、权限或规则。

public 布尔型 remove ( $object )
$object yii\rbac\Role|yii\rbac\Permission|yii\rbac\Rule
返回值 boolean

角色、权限或规则是否成功删除

                public function remove($object)
{
    if ($object instanceof Item) {
        return $this->removeItem($object);
    } elseif ($object instanceof Rule) {
        return $this->removeRule($object);
    }
    throw new InvalidArgumentException('Removing unsupported object type.');
}

            
removeAll() 公有方法

删除所有授权数据,包括角色、权限、规则和分配。

public void removeAll ( )

                public function removeAll()
{
    $this->removeAllAssignments();
    $this->db->createCommand()->delete($this->itemChildTable)->execute();
    $this->db->createCommand()->delete($this->itemTable)->execute();
    $this->db->createCommand()->delete($this->ruleTable)->execute();
    $this->invalidateCache();
}

            
removeAllAssignments() 公有方法

删除所有角色分配。

public void removeAllAssignments ( )

                public function removeAllAssignments()
{
    $this->checkAccessAssignments = [];
    $this->db->createCommand()->delete($this->assignmentTable)->execute();
}

            
removeAllItems() 受保护方法

删除指定类型的全部授权项。

protected void removeAllItems ( $type )
$type integer

授权项类型(Item::TYPE_PERMISSION 或 Item::TYPE_ROLE)

                protected function removeAllItems($type)
{
    if (!$this->supportsCascadeUpdate()) {
        $names = (new Query())
            ->select(['name'])
            ->from($this->itemTable)
            ->where(['type' => $type])
            ->column($this->db);
        if (empty($names)) {
            return;
        }
        $key = $type == Item::TYPE_PERMISSION ? 'child' : 'parent';
        $this->db->createCommand()
            ->delete($this->itemChildTable, [$key => $names])
            ->execute();
        $this->db->createCommand()
            ->delete($this->assignmentTable, ['item_name' => $names])
            ->execute();
    }
    $this->db->createCommand()
        ->delete($this->itemTable, ['type' => $type])
        ->execute();
    $this->invalidateCache();
}

            
removeAllPermissions() 公有方法

删除所有权限。

所有父项子项关系将相应调整。

public void removeAllPermissions ( )

                public function removeAllPermissions()
{
    $this->removeAllItems(Item::TYPE_PERMISSION);
}

            
removeAllRoles() 公有方法

删除所有角色。

所有父项子项关系将相应调整。

public void removeAllRoles ( )

                public function removeAllRoles()
{
    $this->removeAllItems(Item::TYPE_ROLE);
}

            
removeAllRules() 公有方法

删除所有规则。

所有具有规则的角色和权限都将相应调整。

public void removeAllRules ( )

                public function removeAllRules()
{
    if (!$this->supportsCascadeUpdate()) {
        $this->db->createCommand()
            ->update($this->itemTable, ['rule_name' => null])
            ->execute();
    }
    $this->db->createCommand()->delete($this->ruleTable)->execute();
    $this->invalidateCache();
}

            
removeChild() 公共方法

从其父级中删除子级。

注意,子项不会被删除。仅删除父子关系。

public boolean removeChild ( $parent, $child )
$parent yii\rbac\Item
$child yii\rbac\Item
返回值 boolean

移除是否成功

                public function removeChild($parent, $child)
{
    $result = $this->db->createCommand()
        ->delete($this->itemChildTable, ['parent' => $parent->name, 'child' => $child->name])
        ->execute() > 0;
    $this->invalidateCache();
    return $result;
}

            
removeChildren() 公共方法

从其父级中删除所有子级。

注意,子项不会被删除。仅删除父子关系。

public boolean removeChildren ( $parent )
$parent yii\rbac\Item
返回值 boolean

移除是否成功

                public function removeChildren($parent)
{
    $result = $this->db->createCommand()
        ->delete($this->itemChildTable, ['parent' => $parent->name])
        ->execute() > 0;
    $this->invalidateCache();
    return $result;
}

            
removeItem() 受保护方法

从 RBAC 系统中删除授权项。

protected boolean removeItem ( $item )
$item yii\rbac\Item

要移除的项

返回值 boolean

角色或权限是否成功移除

抛出 异常

如果数据验证或保存失败(例如角色或权限的名称不唯一)

                protected function removeItem($item)
{
    if (!$this->supportsCascadeUpdate()) {
        $this->db->createCommand()
            ->delete($this->itemChildTable, ['or', '[[parent]]=:parent', '[[child]]=:child'], [':parent' => $item->name, ':child' => $item->name])
            ->execute();
        $this->db->createCommand()
            ->delete($this->assignmentTable, ['item_name' => $item->name])
            ->execute();
    }
    $this->db->createCommand()
        ->delete($this->itemTable, ['name' => $item->name])
        ->execute();
    $this->invalidateCache();
    return true;
}

            
removeRule() 受保护方法

从 RBAC 系统中删除规则。

protected boolean removeRule ( $rule )
$rule yii\rbac\Rule

要移除的规则

返回值 boolean

规则是否成功移除

抛出 异常

如果数据验证或保存失败(例如规则名称不唯一)

                protected function removeRule($rule)
{
    if (!$this->supportsCascadeUpdate()) {
        $this->db->createCommand()
            ->update($this->itemTable, ['rule_name' => null], ['rule_name' => $rule->name])
            ->execute();
    }
    $this->db->createCommand()
        ->delete($this->ruleTable, ['name' => $rule->name])
        ->execute();
    $this->invalidateCache();
    return true;
}

            
revoke() 公共方法

撤销用户的角色。

public boolean revoke ( $role, $userId )
$role yii\rbac\Role|yii\rbac\Permission
$userId 字符串|整数

用户 ID(参见 yii\web\User::$id

返回值 boolean

撤销是否成功

                public function revoke($role, $userId)
{
    if ($this->isEmptyUserId($userId)) {
        return false;
    }
    unset($this->checkAccessAssignments[(string) $userId]);
    $result = $this->db->createCommand()
        ->delete($this->assignmentTable, ['user_id' => (string) $userId, 'item_name' => $role->name])
        ->execute() > 0;
    $this->invalidateCache();
    return $result;
}

            
revokeAll() 公共方法

撤销用户的全部角色。

public boolean revokeAll ( $userId )
$userId mixed

用户 ID(参见 yii\web\User::$id

返回值 boolean

撤销是否成功

                public function revokeAll($userId)
{
    if ($this->isEmptyUserId($userId)) {
        return false;
    }
    unset($this->checkAccessAssignments[(string) $userId]);
    $result = $this->db->createCommand()
        ->delete($this->assignmentTable, ['user_id' => (string) $userId])
        ->execute() > 0;
    $this->invalidateCache();
    return $result;
}

            
setDefaultRoles() 公共方法 (自版本 2.0.14 起可用)

定义于: yii\rbac\BaseManager::setDefaultRoles()

设置默认角色

public void setDefaultRoles ( $roles )
$roles string[]|Closure

角色数组或返回角色数组的可调用对象

抛出 yii\base\InvalidArgumentException

当 $roles 既不是数组也不是 Closure 时

抛出 yii\base\InvalidValueException

当 Closure 返回值不是数组时

                public function setDefaultRoles($roles)
{
    if (is_array($roles)) {
        $this->defaultRoles = $roles;
    } elseif ($roles instanceof \Closure) {
        $roles = call_user_func($roles);
        if (!is_array($roles)) {
            throw new InvalidValueException('Default roles closure must return an array');
        }
        $this->defaultRoles = $roles;
    } else {
        throw new InvalidArgumentException('Default roles must be either an array or a callable');
    }
}

            
supportsCascadeUpdate() 受保护方法

返回一个值,指示数据库是否支持级联更新和删除。

默认实现将对 SQLite 数据库返回 false,对所有其他数据库返回 true。

protected boolean supportsCascadeUpdate ( )
返回值 boolean

数据库是否支持级联更新和删除。

                protected function supportsCascadeUpdate()
{
    return strncmp($this->db->getDriverName(), 'sqlite', 6) !== 0;
}

            
trigger() 公共方法

定义于: yii\base\Component::trigger()

触发事件。

此方法表示事件的发生。它调用事件的所有附加处理程序,包括类级处理程序。

public void trigger ( $name, yii\base\Event $event null )
$name string

事件名称

$event yii\base\Event|null

事件实例。如果未设置,将创建一个默认的 yii\base\Event 对象。

                public function trigger($name, Event $event = null)
{
    $this->ensureBehaviors();
    $eventHandlers = [];
    foreach ($this->_eventWildcards as $wildcard => $handlers) {
        if (StringHelper::matchWildcard($wildcard, $name)) {
            $eventHandlers[] = $handlers;
        }
    }
    if (!empty($this->_events[$name])) {
        $eventHandlers[] = $this->_events[$name];
    }
    if (!empty($eventHandlers)) {
        $eventHandlers = call_user_func_array('array_merge', $eventHandlers);
        if ($event === null) {
            $event = new Event();
        }
        if ($event->sender === null) {
            $event->sender = $this;
        }
        $event->handled = false;
        $event->name = $name;
        foreach ($eventHandlers as $handler) {
            $event->data = $handler[1];
            call_user_func($handler[0], $event);
            // stop further handling if the event is handled
            if ($event->handled) {
                return;
            }
        }
    }
    // invoke class-level attached handlers
    Event::trigger($this, $name, $event);
}

            
update() 公共方法

定义于: yii\rbac\BaseManager::update()

更新系统中指定的角色、权限或规则。

public boolean update ( $name, $object )
$name string

角色、权限或规则的旧名称

$object yii\rbac\Role|yii\rbac\Permission|yii\rbac\Rule
返回值 boolean

更新是否成功

抛出 异常

如果数据验证或保存失败(例如角色或权限的名称不唯一)

                public function update($name, $object)
{
    if ($object instanceof Item) {
        if ($object->ruleName && $this->getRule($object->ruleName) === null) {
            $rule = \Yii::createObject($object->ruleName);
            $rule->name = $object->ruleName;
            $this->addRule($rule);
        }
        return $this->updateItem($name, $object);
    } elseif ($object instanceof Rule) {
        return $this->updateRule($name, $object);
    }
    throw new InvalidArgumentException('Updating unsupported object type.');
}

            
updateItem() 受保护方法

更新 RBAC 系统中的授权项。

protected boolean updateItem ( $name, $item )
$name string

正在更新的项的名称

$item yii\rbac\Item

已更新的项

返回值 boolean

授权项是否成功更新

抛出 异常

如果数据验证或保存失败(例如角色或权限的名称不唯一)

                protected function updateItem($name, $item)
{
    if ($item->name !== $name && !$this->supportsCascadeUpdate()) {
        $this->db->createCommand()
            ->update($this->itemChildTable, ['parent' => $item->name], ['parent' => $name])
            ->execute();
        $this->db->createCommand()
            ->update($this->itemChildTable, ['child' => $item->name], ['child' => $name])
            ->execute();
        $this->db->createCommand()
            ->update($this->assignmentTable, ['item_name' => $item->name], ['item_name' => $name])
            ->execute();
    }
    $item->updatedAt = time();
    $this->db->createCommand()
        ->update($this->itemTable, [
            'name' => $item->name,
            'description' => $item->description,
            'rule_name' => $item->ruleName,
            'data' => $item->data === null ? null : serialize($item->data),
            'updated_at' => $item->updatedAt,
        ], [
            'name' => $name,
        ])->execute();
    $this->invalidateCache();
    return true;
}

            
updateRule() 受保护方法

将规则更新到 RBAC 系统。

protected boolean updateRule ( $name, $rule )
$name string

正在更新的规则的名称

$rule yii\rbac\Rule

已更新的规则

返回值 boolean

规则是否成功更新

抛出 异常

如果数据验证或保存失败(例如规则名称不唯一)

                protected function updateRule($name, $rule)
{
    if ($rule->name !== $name && !$this->supportsCascadeUpdate()) {
        $this->db->createCommand()
            ->update($this->itemTable, ['rule_name' => $rule->name], ['rule_name' => $name])
            ->execute();
    }
    $rule->updatedAt = time();
    $this->db->createCommand()
        ->update($this->ruleTable, [
            'name' => $rule->name,
            'data' => serialize($rule),
            'updated_at' => $rule->updatedAt,
        ], [
            'name' => $name,
        ])->execute();
    $this->invalidateCache();
    return true;
}