0 关注者

类 yii\rbac\PhpManager

继承yii\rbac\PhpManager » 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/PhpManager.php

PhpManager 表示一个授权管理器,它将授权信息存储为 PHP 脚本文件。

授权数据将被保存到并从三个文件加载,这三个文件由 $itemFile$assignmentFile$ruleFile 指定。

PhpManager 主要适用于授权数据量不大的情况(例如,个人博客系统的授权数据)。对于更复杂的授权数据,请使用 yii\rbac\DbManager

请注意,PhpManager 不兼容 facebook 的 HHVM,因为它依赖于写入 php 文件并在之后包含它们,而这是 HHVM 不支持的。

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

公共属性

隐藏继承的属性

属性 类型 描述 定义于
$assignmentFile string 包含授权分配的 PHP 脚本的路径。 yii\rbac\PhpManager
$assignments array yii\rbac\PhpManager
$behaviors yii\base\Behavior[] 附加到此组件的行为列表。 yii\base\Component
$children array yii\rbac\PhpManager
$defaultRoleInstances yii\rbac\Role[] 默认角色。 yii\rbac\BaseManager
$defaultRoles array 角色名称列表,这些角色会自动分配给每个用户,无需调用 assign() yii\rbac\BaseManager
$itemFile string 包含授权项的 PHP 脚本的路径。 yii\rbac\PhpManager
$items yii\rbac\Item[] yii\rbac\PhpManager
$permissions yii\rbac\Permission[] 系统中的所有权限。 yii\rbac\BaseManager
$roles yii\rbac\Role[] 系统中的所有角色。 yii\rbac\BaseManager
$ruleFile string 包含授权规则的 PHP 脚本的路径。 yii\rbac\PhpManager
$rules yii\rbac\Rule[] yii\rbac\PhpManager

受保护的属性

隐藏继承的属性

属性 类型 描述 定义于

公共方法

隐藏继承的方法

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

受保护方法

隐藏继承的方法

方法 描述 定义于
addItem() 将授权项目添加到 RBAC 系统中。 yii\rbac\PhpManager
addRule() 将规则添加到 RBAC 系统中。 yii\rbac\PhpManager
checkAccessRecursive() 对指定用户执行访问检查。 yii\rbac\PhpManager
detectLoop() 检查授权项目层次结构中是否存在循环。 yii\rbac\PhpManager
executeRule() 执行与指定授权项目关联的规则。 yii\rbac\BaseManager
getChildrenRecursive() 递归查找指定项目的子项和孙子项。 yii\rbac\PhpManager
getDirectPermissionsByUser() 返回直接分配给用户的权限。 yii\rbac\PhpManager
getInheritedPermissionsByUser() 返回用户从分配给他的角色继承的所有权限。 yii\rbac\PhpManager
hasNoAssignments() 检查 $assignments 数组是否为空,并且 $defaultRoles 属性也为空。 yii\rbac\BaseManager
invalidateScriptCache() 使给定文件的预编译脚本缓存(如 OPCache 或 APC)失效。 yii\rbac\PhpManager
load() 从持久存储中加载授权数据。 yii\rbac\PhpManager
loadFromFile() 从 PHP 脚本文件中加载授权数据。 yii\rbac\PhpManager
removeAllItems() 删除指定类型的授权项。 yii\rbac\PhpManager
removeRule() 从 RBAC 系统中删除规则。 yii\rbac\PhpManager
save() 将授权数据保存到持久存储中。 yii\rbac\PhpManager
saveAssignments() 将分配数据保存到持久存储中。 yii\rbac\PhpManager
saveItems() 将项目数据保存到持久存储中。 yii\rbac\PhpManager
saveRules() 将规则数据保存到持久存储中。 yii\rbac\PhpManager
saveToFile() 将授权数据保存到 PHP 脚本文件中。 yii\rbac\PhpManager
updateItem() 在 RBAC 系统中更新授权项。 yii\rbac\PhpManager

属性详细信息

隐藏继承的属性

$assignmentFile 公共属性

包含授权分配的 PHP 脚本的路径。这可以是文件路径或指向该文件的 路径别名。如果需要在线更改授权,请确保此文件可由 Web 服务器进程写入。

另请参见

public string $assignmentFile '@app/rbac/assignments.php'
$assignments 受保护属性
protected array $assignments = []
$children 受保护属性
protected array $children = []
$itemFile 公共属性

包含授权项目的 PHP 脚本的路径。这可以是文件路径或指向该文件的 路径别名。如果需要在线更改授权,请确保此文件可由 Web 服务器进程写入。

另请参见

public string $itemFile '@app/rbac/items.php'
$items 受保护属性
protected yii\rbac\Item[] $items = []
$ruleFile 公共属性

包含授权规则的 PHP 脚本的路径。这可以是文件路径或指向该文件的 路径别名。如果需要在线更改授权,请确保此文件可由 Web 服务器进程写入。

另请参见

public string $ruleFile '@app/rbac/rules.php'
$rules 受保护属性
protected yii\rbac\Rule[] $rules = []

方法详细信息

隐藏继承的方法

__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() public method

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

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

此方法将按以下顺序检查并采取相应措施

  • 由 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() public method

定义于: 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() public method

定义于: 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() public method

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

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

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

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

抛出异常 Exception

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

                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 method

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

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

子项是否成功添加

抛出异常 yii\base\Exception

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

                public function addChild($parent, $child)
{
    if (!isset($this->items[$parent->name], $this->items[$child->name])) {
        throw new InvalidArgumentException("Either '{$parent->name}' or '{$child->name}' does not exist.");
    }
    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.");
    }
    if (isset($this->children[$parent->name][$child->name])) {
        throw new InvalidCallException("The item '{$parent->name}' already has a child '{$child->name}'.");
    }
    $this->children[$parent->name][$child->name] = $this->items[$child->name];
    $this->saveItems();
    return true;
}

            
addItem() protected method

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

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

要添加的项目

返回值 boolean

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

抛出异常 Exception

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

                protected function addItem($item)
{
    $time = time();
    if ($item->createdAt === null) {
        $item->createdAt = $time;
    }
    if ($item->updatedAt === null) {
        $item->updatedAt = $time;
    }
    $this->items[$item->name] = $item;
    $this->saveItems();
    return true;
}

            
addRule() protected method

将规则添加到 RBAC 系统中。

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

要添加的规则

返回值 boolean

规则是否成功添加到系统

抛出异常 Exception

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

                protected function addRule($rule)
{
    $this->rules[$rule->name] = $rule;
    $this->saveRules();
    return true;
}

            
assign() public method

将角色分配给用户。

public yii\rbac\Assignment assign ( $role, $userId )
$role yii\rbac\Role|yii\rbac\Permission
$userId string|integer

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

返回值 yii\rbac\Assignment

角色分配信息。

抛出异常 Exception

如果角色已分配给用户

                public function assign($role, $userId)
{
    if (!isset($this->items[$role->name])) {
        throw new InvalidArgumentException("Unknown role '{$role->name}'.");
    } elseif (isset($this->assignments[$userId][$role->name])) {
        throw new InvalidArgumentException("Authorization item '{$role->name}' has already been assigned to user '$userId'.");
    }
    $this->assignments[$userId][$role->name] = new Assignment([
        'userId' => $userId,
        'roleName' => $role->name,
        'createdAt' => time(),
    ]);
    $this->saveAssignments();
    return $this->assignments[$userId][$role->name];
}

            
attachBehavior() public method

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

将行为附加到此组件。

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

另请参见 detachBehavior()

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

行为的名称。

$behavior string|array|yii\base\Behavior

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

返回值 yii\base\Behavior

行为对象

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

            
attachBehaviors() public method

定义于: 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 array behaviors ( )
返回值 array

行为配置。

                public function behaviors()
{
    return [];
}

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

检查将子项添加到父项的可能性。

public boolean 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 boolean 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 boolean 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 = [])
{
    $assignments = $this->getAssignments($userId);
    if ($this->hasNoAssignments($assignments)) {
        return false;
    }
    return $this->checkAccessRecursive($userId, $permissionName, $params, $assignments);
}

            
checkAccessRecursive() 受保护的方法

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

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

protected boolean checkAccessRecursive ( $user, $itemName, $params, $assignments )
$user string|integer

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

$itemName string

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

$params array

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

$assignments yii\rbac\Assignment[]

指定用户的分配

返回值 boolean

用户是否可以执行操作。

                protected function checkAccessRecursive($user, $itemName, $params, $assignments)
{
    if (!isset($this->items[$itemName])) {
        return false;
    }
    /* @var $item Item */
    $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;
    }
    foreach ($this->children as $parentName => $children) {
        if (isset($children[$itemName]) && $this->checkAccessRecursive($user, $parentName, $params, $assignments)) {
            return true;
        }
    }
    return false;
}

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

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

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

public static string className ( )
返回值 string

此类的完全限定名称。

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

            
createPermission() 公共方法

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

创建一个新的 Permission 对象。

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

public 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() 以将其添加到系统中。

public 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() 方法将被调用。

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

行为的名称。

返回值 yii\base\Behavior|null

分离的行为。如果行为不存在,则为 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()

从组件中分离所有行为。

public void detachBehaviors ( )

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

            
detectLoop() 受保护方法

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

protected boolean detectLoop ( $parent, $child )
$parent yii\rbac\Item

父项

$child yii\rbac\Item

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

返回值 boolean

是否存在循环

                protected function detectLoop($parent, $child)
{
    if ($child->name === $parent->name) {
        return true;
    }
    if (!isset($this->children[$child->name], $this->items[$parent->name])) {
        return false;
    }
    foreach ($this->children[$child->name] as $grandchild) {
        /* @var $grandchild Item */
        if ($this->detectLoop($parent, $grandchild)) {
            return true;
        }
    }
    return false;
}

            
ensureBehaviors() 公共方法

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

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

public void 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() 的值。

protected boolean executeRule ( $user, $item, $params )
$user string|integer

用户 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() 公共方法

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

public yii\rbac\Assignment|null getAssignment ( $roleName, $userId )
$roleName string

角色名称

$userId string|integer

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

返回值 yii\rbac\Assignment|null

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

                public function getAssignment($roleName, $userId)
{
    return isset($this->assignments[$userId][$roleName]) ? $this->assignments[$userId][$roleName] : null;
}

            
getAssignments() 公共方法

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

public yii\rbac\Assignment[] getAssignments ( $userId )
$userId string|integer

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

返回值 yii\rbac\Assignment[]

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

                public function getAssignments($userId)
{
    return isset($this->assignments[$userId]) ? $this->assignments[$userId] : [];
}

            
getBehavior() 公共方法

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

返回命名行为对象。

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

行为名称

返回值 yii\base\Behavior|null

行为对象,如果行为不存在,则为 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, $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)
{
    return isset($this->children[$name]) ? $this->children[$name] : [];
}

            
getChildrenRecursive() 受保护方法

递归查找指定项目的子项和孙子项。

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

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

$result array

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

                protected function getChildrenRecursive($name, &$result)
{
    if (isset($this->children[$name])) {
        foreach ($this->children[$name] as $child) {
            $result[$child->name] = true;
            $this->getChildrenRecursive($child->name, $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 string|integer

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

返回值 yii\rbac\Permission[]

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

                protected function getDirectPermissionsByUser($userId)
{
    $permissions = [];
    foreach ($this->getAssignments($userId) as $name => $assignment) {
        $permission = $this->items[$assignment->roleName];
        if ($permission->type === Item::TYPE_PERMISSION) {
            $permissions[$name] = $permission;
        }
    }
    return $permissions;
}

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

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

protected yii\rbac\Permission[] getInheritedPermissionsByUser ( $userId )
$userId string|integer

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

返回值 yii\rbac\Permission[]

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

                protected function getInheritedPermissionsByUser($userId)
{
    $assignments = $this->getAssignments($userId);
    $result = [];
    foreach (array_keys($assignments) as $roleName) {
        $this->getChildrenRecursive($roleName, $result);
    }
    if (empty($result)) {
        return [];
    }
    $permissions = [];
    foreach (array_keys($result) as $itemName) {
        if (isset($this->items[$itemName]) && $this->items[$itemName] instanceof Permission) {
            $permissions[$itemName] = $this->items[$itemName];
        }
    }
    return $permissions;
}

            
getItem() 公共方法

返回命名授权项。

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

授权项名称。

返回值 yii\rbac\Item|null

与指定名称对应的授权项。如果没有这样的项,则返回 null。

                public function getItem($name)
{
    return isset($this->items[$name]) ? $this->items[$name] : null;
}

            
getItems() 公共方法

返回指定类型的项目。

public yii\rbac\Item[] getItems ( $type )
$type 整数

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

返回值 yii\rbac\Item[]

指定类型的授权项。

                public function getItems($type)
{
    $items = [];
    foreach ($this->items as $name => $item) {
        /* @var $item Item */
        if ($item->type == $type) {
            $items[$name] = $item;
        }
    }
    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)
{
    $result = [];
    $this->getChildrenRecursive($roleName, $result);
    if (empty($result)) {
        return [];
    }
    $permissions = [];
    foreach (array_keys($result) as $itemName) {
        if (isset($this->items[$itemName]) && $this->items[$itemName] instanceof Permission) {
            $permissions[$itemName] = $this->items[$itemName];
        }
    }
    return $permissions;
}

            
getPermissionsByUser() 公共方法

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

public yii\rbac\Permission[] getPermissionsByUser ( $userId )
$userId string|integer

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

返回值 yii\rbac\Permission[]

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

                public function getPermissionsByUser($userId)
{
    $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)
{
    $roles = $this->getDefaultRoleInstances();
    foreach ($this->getAssignments($userId) as $name => $assignment) {
        $role = $this->items[$assignment->roleName];
        if ($role->type === Item::TYPE_ROLE) {
            $roles[$name] = $role;
        }
    }
    return $roles;
}

            
getRule() 公共方法

返回指定名称的规则。

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

规则名称

返回值 yii\rbac\Rule|null

规则对象,如果指定名称不对应于规则,则为 null。

                public function getRule($name)
{
    return isset($this->rules[$name]) ? $this->rules[$name] : null;
}

            
getRules() 公共方法

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

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

以规则名称为索引的规则

                public function getRules()
{
    return $this->rules;
}

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

返回分配给指定角色的所有用户 ID。

public array getUserIdsByRole ( $roleName )
$roleName string
返回值 array

用户 ID 字符串数组

                public function getUserIdsByRole($roleName)
{
    $result = [];
    foreach ($this->assignments as $userID => $assignments) {
        foreach ($assignments as $userAssignment) {
            if ($userAssignment->roleName === $roleName && $userAssignment->userId == $userID) {
                $result[] = (string) $userID;
            }
        }
    }
    return $result;
}

            
hasChild() 公共方法

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

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

$child 是否已经是 $parent 的子节点

                public function hasChild($parent, $child)
{
    return isset($this->children[$parent->name][$child->name]);
}

            
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() 公共方法

初始化应用程序组件。

此方法通过从 PHP 脚本加载授权数据来覆盖父实现。

public void init ( )

                public function init()
{
    parent::init();
    $this->itemFile = Yii::getAlias($this->itemFile);
    $this->assignmentFile = Yii::getAlias($this->assignmentFile);
    $this->ruleFile = Yii::getAlias($this->ruleFile);
    $this->load();
}

            
invalidateScriptCache() 受保护方法 (自版本 2.0.9 起可用)

使给定文件的预编译脚本缓存(如 OPCache 或 APC)失效。

protected void invalidateScriptCache ( $file )
$file string

文件路径。

                protected function invalidateScriptCache($file)
{
    if (function_exists('opcache_invalidate')) {
        opcache_invalidate($file, true);
    }
    if (function_exists('apc_delete_file')) {
        @apc_delete_file($file);
    }
}

            
load() 受保护方法

从持久存储中加载授权数据。

protected void load ( )

                protected function load()
{
    $this->children = [];
    $this->rules = [];
    $this->assignments = [];
    $this->items = [];
    $items = $this->loadFromFile($this->itemFile);
    $itemsMtime = @filemtime($this->itemFile);
    $assignments = $this->loadFromFile($this->assignmentFile);
    $assignmentsMtime = @filemtime($this->assignmentFile);
    $rules = $this->loadFromFile($this->ruleFile);
    foreach ($items as $name => $item) {
        $class = $item['type'] == Item::TYPE_PERMISSION ? Permission::className() : Role::className();
        $this->items[$name] = new $class([
            'name' => $name,
            'description' => isset($item['description']) ? $item['description'] : null,
            'ruleName' => isset($item['ruleName']) ? $item['ruleName'] : null,
            'data' => isset($item['data']) ? $item['data'] : null,
            'createdAt' => $itemsMtime,
            'updatedAt' => $itemsMtime,
        ]);
    }
    foreach ($items as $name => $item) {
        if (isset($item['children'])) {
            foreach ($item['children'] as $childName) {
                if (isset($this->items[$childName])) {
                    $this->children[$name][$childName] = $this->items[$childName];
                }
            }
        }
    }
    foreach ($assignments as $userId => $roles) {
        foreach ($roles as $role) {
            $this->assignments[$userId][$role] = new Assignment([
                'userId' => $userId,
                'roleName' => $role,
                'createdAt' => $assignmentsMtime,
            ]);
        }
    }
    foreach ($rules as $name => $ruleData) {
        $this->rules[$name] = unserialize($ruleData);
    }
}

            
loadFromFile() 受保护方法

从 PHP 脚本文件中加载授权数据。

另请参阅 saveToFile()

protected array loadFromFile ( $file )
$file string

文件路径。

返回值 array

授权数据

                protected function loadFromFile($file)
{
    if (is_file($file)) {
        return require $file;
    }
    return [];
}

            
off() 公共方法

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

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

此方法与 on() 相反。

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

另请参阅 on()

public boolean off ( $name, $handler null )
$name string

事件名称

$handler callable|null

要删除的事件处理程序。如果为 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 callable

事件处理程序

$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]);
    }
}

            
remove() 公共方法

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

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

public boolean 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->children = [];
    $this->items = [];
    $this->assignments = [];
    $this->rules = [];
    $this->save();
}

            
removeAllAssignments() 公共方法

删除所有角色分配。

public void removeAllAssignments ( )

                public function removeAllAssignments()
{
    $this->assignments = [];
    $this->saveAssignments();
}

            
removeAllItems() 受保护方法

删除指定类型的授权项。

protected void removeAllItems ( $type )
$type 整数

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

                protected function removeAllItems($type)
{
    $names = [];
    foreach ($this->items as $name => $item) {
        if ($item->type == $type) {
            unset($this->items[$name]);
            $names[$name] = true;
        }
    }
    if (empty($names)) {
        return;
    }
    foreach ($this->assignments as $i => $assignments) {
        foreach ($assignments as $n => $assignment) {
            if (isset($names[$assignment->roleName])) {
                unset($this->assignments[$i][$n]);
            }
        }
    }
    foreach ($this->children as $name => $children) {
        if (isset($names[$name])) {
            unset($this->children[$name]);
        } else {
            foreach ($children as $childName => $item) {
                if (isset($names[$childName])) {
                    unset($children[$childName]);
                }
            }
            $this->children[$name] = $children;
        }
    }
    $this->saveItems();
}

            
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()
{
    foreach ($this->items as $item) {
        $item->ruleName = null;
    }
    $this->rules = [];
    $this->saveRules();
}

            
removeChild() 公共方法

从父项中删除子项。

注意,子项不会被删除。只删除了父节点-子节点关系。

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

删除是否成功

                public function removeChild($parent, $child)
{
    if (isset($this->children[$parent->name][$child->name])) {
        unset($this->children[$parent->name][$child->name]);
        $this->saveItems();
        return true;
    }
    return false;
}

            
removeChildren() 公共方法

从父项中删除所有子项。

注意,子项不会被删除。只删除了父节点-子节点关系。

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

删除是否成功

                public function removeChildren($parent)
{
    if (isset($this->children[$parent->name])) {
        unset($this->children[$parent->name]);
        $this->saveItems();
        return true;
    }
    return false;
}

            
removeItem() 公共方法

从 RBAC 系统中删除授权项。

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

要删除的项

返回值 boolean

角色或权限是否成功删除

抛出异常 Exception

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

                public function removeItem($item)
{
    if (isset($this->items[$item->name])) {
        foreach ($this->children as &$children) {
            unset($children[$item->name]);
        }
        foreach ($this->assignments as &$assignments) {
            unset($assignments[$item->name]);
        }
        unset($this->items[$item->name]);
        $this->saveItems();
        $this->saveAssignments();
        return true;
    }
    return false;
}

            
removeRule() 受保护方法

从 RBAC 系统中删除规则。

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

要删除的规则

返回值 boolean

规则是否成功删除

抛出异常 Exception

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

                protected function removeRule($rule)
{
    if (isset($this->rules[$rule->name])) {
        unset($this->rules[$rule->name]);
        foreach ($this->items as $item) {
            if ($item->ruleName === $rule->name) {
                $item->ruleName = null;
            }
        }
        $this->saveRules();
        return true;
    }
    return false;
}

            
revoke() 公共方法

从用户撤销角色。

public boolean revoke ( $role, $userId )
$role yii\rbac\Role|yii\rbac\Permission
$userId string|integer

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

返回值 boolean

撤销是否成功

                public function revoke($role, $userId)
{
    if (isset($this->assignments[$userId][$role->name])) {
        unset($this->assignments[$userId][$role->name]);
        $this->saveAssignments();
        return true;
    }
    return false;
}

            
revokeAll() 公共方法

从用户撤销所有角色。

public boolean revokeAll ( $userId )
$userId mixed

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

返回值 boolean

撤销是否成功

                public function revokeAll($userId)
{
    if (isset($this->assignments[$userId]) && is_array($this->assignments[$userId])) {
        foreach ($this->assignments[$userId] as $itemName => $value) {
            unset($this->assignments[$userId][$itemName]);
        }
        $this->saveAssignments();
        return true;
    }
    return false;
}

            
save() 受保护方法

将授权数据保存到持久存储中。

protected void save ( )

                protected function save()
{
    $this->saveItems();
    $this->saveAssignments();
    $this->saveRules();
}

            
saveAssignments() 受保护方法

将分配数据保存到持久存储中。

protected void saveAssignments ( )

                protected function saveAssignments()
{
    $assignmentData = [];
    foreach ($this->assignments as $userId => $assignments) {
        foreach ($assignments as $name => $assignment) {
            /* @var $assignment Assignment */
            $assignmentData[$userId][] = $assignment->roleName;
        }
    }
    $this->saveToFile($assignmentData, $this->assignmentFile);
}

            
saveItems() 受保护方法

将项目数据保存到持久存储中。

protected void saveItems ( )

                protected function saveItems()
{
    $items = [];
    foreach ($this->items as $name => $item) {
        /* @var $item Item */
        $items[$name] = array_filter(
            [
                'type' => $item->type,
                'description' => $item->description,
                'ruleName' => $item->ruleName,
                'data' => $item->data,
            ]
        );
        if (isset($this->children[$name])) {
            foreach ($this->children[$name] as $child) {
                /* @var $child Item */
                $items[$name]['children'][] = $child->name;
            }
        }
    }
    $this->saveToFile($items, $this->itemFile);
}

            
saveRules() 受保护方法

将规则数据保存到持久存储中。

protected void saveRules ( )

                protected function saveRules()
{
    $rules = [];
    foreach ($this->rules as $name => $rule) {
        $rules[$name] = serialize($rule);
    }
    $this->saveToFile($rules, $this->ruleFile);
}

            
saveToFile() 受保护方法

将授权数据保存到 PHP 脚本文件中。

另请参阅 loadFromFile().

protected void saveToFile ( $data, $file )
$data array

授权数据

$file string

文件路径。

                protected function saveToFile($data, $file)
{
    file_put_contents($file, "<?php\n\nreturn " . VarDumper::export($data) . ";\n", LOCK_EX);
    $this->invalidateScriptCache($file);
}

            
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');
    }
}

            
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

更新是否成功

抛出异常 Exception

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

                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

权限项是否成功更新

抛出异常 Exception

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

                protected function updateItem($name, $item)
{
    if ($name !== $item->name) {
        if (isset($this->items[$item->name])) {
            throw new InvalidArgumentException("Unable to change the item name. The name '{$item->name}' is already used by another item.");
        }
        // Remove old item in case of renaming
        unset($this->items[$name]);
        if (isset($this->children[$name])) {
            $this->children[$item->name] = $this->children[$name];
            unset($this->children[$name]);
        }
        foreach ($this->children as &$children) {
            if (isset($children[$name])) {
                $children[$item->name] = $children[$name];
                unset($children[$name]);
            }
        }
        foreach ($this->assignments as &$assignments) {
            if (isset($assignments[$name])) {
                $assignments[$item->name] = $assignments[$name];
                $assignments[$item->name]->roleName = $item->name;
                unset($assignments[$name]);
            }
        }
        $this->saveAssignments();
    }
    $this->items[$item->name] = $item;
    $this->saveItems();
    return true;
}

            
updateRule() 公共方法

将规则更新到 RBAC 系统中。

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

要更新的规则的名称

$rule yii\rbac\Rule

更新后的规则

返回值 boolean

规则是否成功更新

抛出异常 Exception

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

                public function updateRule($name, $rule)
{
    if ($rule->name !== $name) {
        unset($this->rules[$name]);
    }
    $this->rules[$rule->name] = $rule;
    $this->saveRules();
    return true;
}