クラス yii\rbac\DbManager
DbManager は、認証情報をデータベースに保存する認証マネージャーを表します。
データベース接続は $db で指定します。データベーススキーマはマイグレーションを適用することで初期化できます。
yii migrate --migrationPath=@yii/rbac/migrations/
マイグレーションを使いたくなく、代わりに SQL が必要な場合は、すべてのデータベースのファイルが migrations ディレクトリにあります。
認証とルールデータを保存するために使用するテーブルの名前を変更するには、$itemTable、$itemChildTable、$assignmentTable および $ruleTable を設定します。
DbManager の詳細および使用法については、セキュリティ認証に関するガイド記事を参照してください。
公開プロパティ
公開メソッド
保護されたメソッド
プロパティの詳細
認証項目の割り当てを格納するテーブルの名前。デフォルトは"auth_assignment"です。
RBACのパフォーマンスを向上させるために使用されるキャッシュ。これは次のいずれかになります
- アプリケーションコンポーネントID(例:
cache
) - 構成配列
- yii\caching\Cacheオブジェクト
これが設定されていない場合、キャッシュが無効になっていることを意味します。
RBACキャッシュを有効にすると、すべての認証項目、ルール、および認証項目の親子関係がキャッシュされ、メモリにロードされることに注意してください。これにより、RBAC権限チェックのパフォーマンスが向上します。ただし、余分なメモリが必要になるため、RBACシステムに多数の認証項目が含まれている場合は適切ではない可能性があります。この場合は、他のRBAC実装(例:Redisストレージに基づくRBAC)を検討する必要があります。
また、このコンポーネントの外部からRBAC項目、ルール、または親子関係を変更する場合は、データの整合性を確保するために手動でinvalidateCache()を呼び出す必要があることに注意してください。
キャッシュに RBAC データを保存するために使用されるキー
$cacheも参照してください。
ユーザーの割り当て (ユーザー ID => 割り当て[])
DB接続オブジェクト、またはDB接続のアプリケーションコンポーネントID。DbManagerオブジェクトを作成した後でこのプロパティを変更する場合は、DB接続オブジェクトのみを割り当てる必要があります。バージョン2.0.2以降では、オブジェクトを作成するための構成配列にすることもできます。
認証項目階層を格納するテーブルの名前。デフォルトは"auth_item_child"です。
認証項目を格納するテーブルの名前。デフォルトは"auth_item"です。
ユーザーの RBAC ロールをキャッシュに保存するために使用されるキー
ルールを格納するテーブルの名前。デフォルトは "auth_rule" です。
メソッドの詳細
定義元: yii\base\Component::__call()
クラスメソッドではない名前付きメソッドを呼び出します。
このメソッドは、アタッチされたビヘイビアに指定された名前のメソッドがあるかどうかをチェックし、あればそれを実行します。
このメソッドは、不明なメソッドが呼び出されたときに暗黙的に呼び出される PHP のマジックメソッドであるため、直接呼び出さないでください。
public mixed __call ( $name, $params ) | ||
$name | string |
メソッド名 |
$params | array |
メソッドのパラメータ |
return | mixed |
メソッドの戻り値 |
---|---|---|
throws | 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()");
}
定義元: yii\base\Component::__clone()
このメソッドは、既存のオブジェクトを複製することによってオブジェクトが作成された後に呼び出されます。
古いオブジェクトにアタッチされているため、すべてのビヘイビアを削除します。
public void __clone ( ) |
public function __clone()
{
$this->_events = [];
$this->_eventWildcards = [];
$this->_behaviors = null;
}
定義元: yii\base\BaseObject::__construct()
コンストラクタ。
デフォルトの実装では、次の2つの処理を行います。
- 与えられた設定
$config
でオブジェクトを初期化します。 - init() を呼び出します。
このメソッドが子クラスでオーバーライドされる場合、次のことが推奨されます。
- コンストラクタの最後のパラメータは、ここでの
$config
のように設定配列であること。 - コンストラクタの最後に親の実装を呼び出すこと。
public void __construct ( $config = [] ) | ||
$config | array |
オブジェクトのプロパティを初期化するために使用される名前と値のペア |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定義元: yii\base\Component::__get()
コンポーネントプロパティの値を返します。
このメソッドは、以下の順序でチェックし、それに応じて動作します。
- ゲッターによって定義されたプロパティ:ゲッターの結果を返します
- ビヘイビアのプロパティ:ビヘイビアのプロパティ値を返します
このメソッドは、$value = $component->property;
を実行したときに暗黙的に呼び出される PHP のマジックメソッドであるため、直接呼び出さないでください。
関連項目: __set()。
public mixed __get ( $name ) | ||
$name | string |
プロパティ名 |
return | mixed |
プロパティ値、またはビヘイビアのプロパティの値 |
---|---|---|
throws | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
throws | 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);
}
定義元: yii\base\Component::__isset()
プロパティが設定されている、つまり定義されており、null でないかどうかを確認します。
このメソッドは、以下の順序でチェックし、それに応じて動作します。
- セッターによって定義されたプロパティ:プロパティが設定されているかどうかを返します
- ビヘイビアのプロパティ:プロパティが設定されているかどうかを返します
- 存在しないプロパティに対しては
false
を返します
このメソッドは、isset($component->property)
を実行したときに暗黙的に呼び出される PHP のマジックメソッドであるため、直接呼び出さないでください。
public boolean __isset ( $name ) | ||
$name | string |
プロパティ名またはイベント名 |
return | 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;
}
定義元: yii\base\Component::__set()
コンポーネントプロパティの値を設定します。
このメソッドは、以下の順序でチェックし、それに応じて動作します。
- セッターによって定義されたプロパティ:プロパティ値を設定します
- "on xyz" の形式のイベント:ハンドラをイベント "xyz" にアタッチします
- "as xyz" の形式のビヘイビア:"xyz" という名前のビヘイビアをアタッチします
- ビヘイビアのプロパティ:ビヘイビアのプロパティ値を設定します
このメソッドは、$component->property = $value;
を実行したときに暗黙的に呼び出される PHP のマジックメソッドであるため、直接呼び出さないでください。
関連項目: __get()。
public void __set ( $name, $value ) | ||
$name | string |
プロパティ名またはイベント名 |
$value | mixed |
プロパティ値 |
throws | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
---|---|---|
throws | 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);
}
定義元: yii\base\Component::__unset()
コンポーネントプロパティを null に設定します。
このメソッドは、以下の順序でチェックし、それに応じて動作します。
- セッターによって定義されたプロパティ:プロパティ値を null に設定します
- ビヘイビアのプロパティ:プロパティ値を null に設定します
このメソッドは、unset($component->property)
を実行したときに暗黙的に呼び出される PHP のマジックメソッドであるため、直接呼び出さないでください。
public void __unset ( $name ) | ||
$name | string |
プロパティ名 |
throws | 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);
}
定義元: yii\rbac\BaseManager::add()
ロール、パーミッション、またはルールを RBAC システムに追加します。
public boolean add ( $object ) | ||
$object | yii\rbac\Role|yii\rbac\Permission|yii\rbac\Rule | |
return | boolean |
ロール、パーミッション、またはルールがシステムに正常に追加されたかどうか |
---|---|---|
throws | 例外 |
データ検証または保存に失敗した場合(ロールまたはパーミッションの名前が一意でない場合など) |
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.');
}
アイテムを別のアイテムの子として追加します。
public boolean addChild ( $parent, $child ) | ||
$parent | yii\rbac\Item | |
$child | yii\rbac\Item | |
return | boolean |
子要素が正常に追加されたかどうか |
---|---|---|
throws | 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;
}
認証項目をRBACシステムに追加します。
protected boolean addItem ( $item ) | ||
$item | yii\rbac\Item |
追加するアイテム |
return | boolean |
認証アイテムがシステムに正常に追加されたかどうか |
---|---|---|
throws | 例外 |
データ検証または保存に失敗した場合(ロールまたはパーミッションの名前が一意でない場合など) |
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;
}
ルールをRBACシステムに追加します。
protected boolean addRule ( $rule ) | ||
$rule | yii\rbac\Rule |
追加するルール |
return | boolean |
ルールがシステムに正常に追加されたかどうか |
---|---|---|
throws | 例外 |
データ検証または保存に失敗した場合(ルールの名前が一意でない場合など) |
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;
}
ユーザーにロールを割り当てます。
public yii\rbac\Assignment assign ( $role, $userId ) | ||
$role | yii\rbac\Role|yii\rbac\Permission | |
$userId | string|integer |
ユーザーID(yii\web\User::$idを参照) |
return | yii\rbac\Assignment |
ロール割り当て情報。 |
---|---|---|
throws | 例外 |
ロールがすでにユーザーに割り当てられている場合 |
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;
}
定義元: yii\base\Component::attachBehavior()
このコンポーネントにビヘイビアをアタッチします。
このメソッドは、指定された設定に基づいてビヘイビアオブジェクトを作成します。その後、yii\base\Behavior::attach()メソッドを呼び出すことにより、ビヘイビアオブジェクトはこのコンポーネントにアタッチされます。
detachBehavior()も参照してください。
public yii\base\Behavior attachBehavior ( $name, $behavior ) | ||
$name | string |
ビヘイビアの名前。 |
$behavior | string|array|yii\base\Behavior |
ビヘイビアの設定。これは次のいずれかになります。
|
return | yii\base\Behavior |
ビヘイビアオブジェクト |
---|
public function attachBehavior($name, $behavior)
{
$this->ensureBehaviors();
return $this->attachBehaviorInternal($name, $behavior);
}
定義元: 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);
}
}
定義元: yii\base\Component::behaviors()
このコンポーネントが動作するはずのビヘイビアのリストを返します。
子クラスは、このメソッドをオーバーライドして、動作させたいビヘイビアを指定できます。
このメソッドの戻り値は、ビヘイビア名でインデックス付けされたビヘイビアオブジェクトまたは構成の配列である必要があります。ビヘイビア構成は、ビヘイビアクラスを指定する文字列、または次の構造の配列のいずれかになります。
'behaviorName' => [
'class' => 'BehaviorClass',
'property1' => 'value1',
'property2' => 'value2',
]
ビヘイビアクラスはyii\base\Behaviorを継承する必要があることに注意してください。ビヘイビアは、名前付きまたは匿名でアタッチできます。名前が配列キーとして使用されている場合、この名前を使用して、後でgetBehavior()を使用してビヘイビアを取得したり、detachBehavior()を使用してデタッチしたりできます。匿名ビヘイビアは、取得またはデタッチできません。
このメソッドで宣言されたビヘイビアは、コンポーネントに自動的にアタッチされます(オンデマンドで)。
public array behaviors ( ) | ||
return | array |
ビヘイビア構成。 |
---|
public function behaviors()
{
return [];
}
親に子を追加できるかどうかを確認します。
public boolean canAddChild ( $parent, $child ) | ||
$parent | yii\rbac\Item |
親アイテム |
$child | yii\rbac\Item |
階層に追加する子アイテム |
return | boolean |
追加の可能性 |
---|
public function canAddChild($parent, $child)
{
return !$this->detectLoop($parent, $child);
}
定義元: yii\base\Component::canGetProperty()
プロパティを読み取ることができるかどうかを示す値を返します。
プロパティは、以下の場合に読み取ることができます。
- クラスに、指定された名前に関連付けられたゲッターメソッドがある場合(この場合、プロパティ名は大文字と小文字が区別されません)。
- クラスに、指定された名前のメンバ変数がある場合(
$checkVars
がtrueの場合)。 - アタッチされたビヘイビアに、指定された名前の読み取り可能なプロパティがある場合(
$checkBehaviors
がtrueの場合)。
canSetProperty()も参照してください。
public boolean canGetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバ変数をプロパティとして扱うかどうか |
$checkBehaviors | boolean |
ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか |
return | 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;
}
定義元: yii\base\Component::canSetProperty()
プロパティを設定できるかどうかを示す値を返します。
プロパティは、以下の場合に書き込み可能です。
- クラスが指定された名前に関連付けられた setter メソッドを持っている場合 (この場合、プロパティ名は大小文字を区別しません);
- クラスに、指定された名前のメンバ変数がある場合(
$checkVars
がtrueの場合)。 - アタッチされたビヘイビアが、指定された名前の書き込み可能なプロパティを持っている場合 (
$checkBehaviors
が true の場合)。
参照: canGetProperty()。
public boolean canSetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバ変数をプロパティとして扱うかどうか |
$checkBehaviors | boolean |
ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか |
return | 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;
}
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);
}
キャッシュからロードされたデータに基づいて、指定されたユーザーのアクセスチェックを実行します。
このメソッドは、$cache が有効になっている場合に checkAccess() によって内部的に呼び出されます。
protected boolean checkAccessFromCache ( $user, $itemName, $params, $assignments ) | ||
$user | string|integer |
ユーザー ID。これは、ユーザーの一意の識別子を表す整数または文字列のいずれかである必要があります。 yii\web\User::$id を参照してください。 |
$itemName | string |
アクセスチェックが必要な操作の名前 |
$params | array |
ユーザーに割り当てられたタスクおよびロールに関連付けられたルールに渡される名前と値のペア。 'user' という名前のパラメーターがこの配列に追加され、 |
$assignments | yii\rbac\Assignment[] |
指定されたユーザーへの割り当て |
return | 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;
}
指定されたユーザーのアクセスチェックを実行します。
このメソッドは、checkAccess() によって内部的に呼び出されます。
protected boolean checkAccessRecursive ( $user, $itemName, $params, $assignments ) | ||
$user | string|integer |
ユーザー ID。これは、ユーザーの一意の識別子を表す整数または文字列のいずれかである必要があります。 yii\web\User::$id を参照してください。 |
$itemName | string |
アクセスチェックが必要な操作の名前 |
$params | array |
ユーザーに割り当てられたタスクおよびロールに関連付けられたルールに渡される名前と値のペア。 'user' という名前のパラメーターがこの配列に追加され、 |
$assignments | yii\rbac\Assignment[] |
指定されたユーザーへの割り当て |
return | 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;
}
::class
を使用してください。
定義元: yii\base\BaseObject::className()
このクラスの完全修飾名を返します。
public static string className ( ) | ||
return | string |
このクラスの完全修飾名。 |
---|
public static function className()
{
return get_called_class();
}
定義元: yii\rbac\BaseManager::createPermission()
新しい Permission オブジェクトを作成します。
新しく作成されたパーミッションは、まだ RBAC システムに追加されていないことに注意してください。必要なデータを入力し、add() を呼び出してシステムに追加する必要があります。
public yii\rbac\Permission createPermission ( $name ) | ||
$name | string |
パーミッション名 |
return | yii\rbac\Permission |
新しい Permission オブジェクト |
---|
public function createPermission($name)
{
$permission = new Permission();
$permission->name = $name;
return $permission;
}
定義元: yii\rbac\BaseManager::createRole()
新しい Role オブジェクトを作成します。
新しく作成されたロールは、まだ RBAC システムに追加されていないことに注意してください。必要なデータを入力し、add() を呼び出してシステムに追加する必要があります。
public yii\rbac\Role createRole ( $name ) | ||
$name | string |
ロール名 |
return | yii\rbac\Role |
新しい Role オブジェクト |
---|
public function createRole($name)
{
$role = new Role();
$role->name = $name;
return $role;
}
定義元: yii\base\Component::detachBehavior()
コンポーネントからビヘイビアをデタッチします。
ビヘイビアの yii\base\Behavior::detach() メソッドが呼び出されます。
public yii\base\Behavior|null detachBehavior ( $name ) | ||
$name | string |
ビヘイビアの名前。 |
return | 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;
}
定義元: yii\base\Component::detachBehaviors()
コンポーネントからすべてのビヘイビアをデタッチします。
public void detachBehaviors ( ) |
public function detachBehaviors()
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $name => $behavior) {
$this->detachBehavior($name);
}
}
認証項目階層にループがあるかどうかをチェックします。
protected boolean detectLoop ( $parent, $child ) | ||
$parent | yii\rbac\Item |
親アイテム |
$child | yii\rbac\Item |
階層に追加する子アイテム |
return | 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;
}
定義元: 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);
}
}
}
定義元: 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()に渡され、ルールに渡されるパラメータ |
return | boolean |
yii\rbac\Rule::execute()の戻り値。認証アイテムがルールを指定していない場合は、trueが返されます。 |
---|---|---|
throws | 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}");
}
ロールとユーザーに関する割り当て情報を返します。
public yii\rbac\Assignment|null getAssignment ( $roleName, $userId ) | ||
$roleName | string |
ロール名 |
$userId | string|integer |
ユーザーID(yii\web\User::$idを参照) |
return | yii\rbac\Assignment|null |
アサインメント情報。ロールがユーザーに割り当てられていない場合は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'],
]);
}
指定されたユーザーのすべてのロール割り当て情報を返します。
public yii\rbac\Assignment[] getAssignments ( $userId ) | ||
$userId | string|integer |
ユーザーID(yii\web\User::$idを参照) |
return | 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;
}
定義元: yii\base\Component::getBehavior()
名前付きビヘイビアオブジェクトを返します。
public yii\base\Behavior|null getBehavior ( $name ) | ||
$name | string |
ビヘイビア名 |
return | yii\base\Behavior|null |
ビヘイビアオブジェクト。ビヘイビアが存在しない場合はnull |
---|
public function getBehavior($name)
{
$this->ensureBehaviors();
return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}
定義元: yii\base\Component::getBehaviors()
このコンポーネントにアタッチされたすべてのビヘイビアを返します。
public yii\base\Behavior[] getBehaviors ( ) | ||
return | yii\base\Behavior[] |
このコンポーネントにアタッチされたビヘイビアのリスト |
---|
public function getBehaviors()
{
$this->ensureBehaviors();
return $this->_behaviors;
}
指定されたロールの子ロールを返します。深さに制限はありません。
public yii\rbac\Role[] getChildRoles ( $roleName ) | ||
$roleName | string |
子ロールを検索するロールの名前 |
return | yii\rbac\Role[] |
子ロール。配列はロール名でインデックス付けされています。最初の要素は親ロール自身のインスタンスです。 |
---|---|---|
throws | 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;
}
子パーミッションおよび/またはロールを返します。
public yii\rbac\Item[] getChildren ( $name ) | ||
$name | string |
親の名前 |
return | 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;
}
すべての親の子を返します。
protected array getChildrenList ( ) | ||
return | 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;
}
指定された項目のすべての子と孫を再帰的に検索します。
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);
}
}
}
定義元: yii\rbac\BaseManager::getDefaultRoleInstances()
Role オブジェクトの配列として defaultRoles を返します。
public yii\rbac\Role[] getDefaultRoleInstances ( ) | ||
return | yii\rbac\Role[] |
デフォルトロール。配列はロール名でインデックス付けされています |
---|
public function getDefaultRoleInstances()
{
$result = [];
foreach ($this->defaultRoles as $roleName) {
$result[$roleName] = $this->createRole($roleName);
}
return $result;
}
定義元: yii\rbac\BaseManager::getDefaultRoles()
デフォルトロールを取得します
public string[] getDefaultRoles ( ) | ||
return | string[] |
デフォルトロール |
---|
public function getDefaultRoles()
{
return $this->defaultRoles;
}
ユーザーに直接割り当てられているすべてのパーミッションを返します。
protected yii\rbac\Permission[] getDirectPermissionsByUser ( $userId ) | ||
$userId | string|integer |
ユーザーID(yii\web\User::$idを参照) |
return | 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;
}
ユーザーが割り当てられたロールから継承するすべてのパーミッションを返します。
protected yii\rbac\Permission[] getInheritedPermissionsByUser ( $userId ) | ||
$userId | string|integer |
ユーザーID(yii\web\User::$idを参照) |
return | 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;
}
名前付き認証項目を返します。
protected yii\rbac\Item|null getItem ( $name ) | ||
$name | string |
認証アイテム名。 |
return | 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);
}
指定されたタイプの項目を返します。
protected yii\rbac\Item[] getItems ( $type ) | ||
$type | integer |
認証アイテムのタイプ(yii\rbac\Item::TYPE_ROLE または yii\rbac\Item::TYPE_PERMISSION のいずれか) |
return | 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;
}
定義元: yii\rbac\BaseManager::getPermission()
名前付きパーミッションを返します。
public yii\rbac\Permission|null getPermission ( $name ) | ||
$name | string |
パーミッション名。 |
return | yii\rbac\Permission|null |
指定された名前に対応するパーミッション。そのようなパーミッションがない場合は Null が返されます。 |
---|
public function getPermission($name)
{
$item = $this->getItem($name);
return $item instanceof Item && $item->type == Item::TYPE_PERMISSION ? $item : null;
}
定義元: yii\rbac\BaseManager::getPermissions()
システム内のすべてのパーミッションを返します。
public yii\rbac\Permission[] getPermissions ( ) | ||
return | yii\rbac\Permission[] |
システム内のすべてのパーミッション。配列はパーミッション名でインデックス付けされています。 |
---|
public function getPermissions()
{
return $this->getItems(Item::TYPE_PERMISSION);
}
指定されたロールが表すすべてのパーミッションを返します。
public yii\rbac\Permission[] getPermissionsByRole ( $roleName ) | ||
$roleName | string |
ロール名 |
return | 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;
}
ユーザーが持つすべてのパーミッションを返します。
public yii\rbac\Permission[] getPermissionsByUser ( $userId ) | ||
$userId | string|integer |
ユーザーID(yii\web\User::$idを参照) |
return | 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);
}
定義元: yii\rbac\BaseManager::getRole()
名前付きロールを返します。
public yii\rbac\Role|null getRole ( $name ) | ||
$name | string |
ロール名。 |
return | yii\rbac\Role|null |
指定された名前に対応するロール。そのようなロールがない場合は Null が返されます。 |
---|
public function getRole($name)
{
$item = $this->getItem($name);
return $item instanceof Item && $item->type == Item::TYPE_ROLE ? $item : null;
}
定義元: yii\rbac\BaseManager::getRoles()
システム内のすべてのロールを返します。
public yii\rbac\Role[] getRoles ( ) | ||
return | yii\rbac\Role[] |
システム内のすべてのロール。配列はロール名でインデックス付けされています。 |
---|
public function getRoles()
{
return $this->getItems(Item::TYPE_ROLE);
}
{@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;
}
指定された名前のルールを返します。
public yii\rbac\Rule|null getRule ( $name ) | ||
$name | string |
ルール名 |
return | 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);
}
システムで利用可能なすべてのルールを返します。
public yii\rbac\Rule[] getRules ( ) | ||
return | 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;
}
指定されたロールのすべてのロール割り当て情報を返します。
public string[] getUserIdsByRole ( $roleName ) | ||
$roleName | string | |
return | 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);
}
親に子がすでに存在するかどうかを示す値を返します。
public boolean hasChild ( $parent, $child ) | ||
$parent | yii\rbac\Item | |
$child | yii\rbac\Item | |
return | boolean |
|
---|
public function hasChild($parent, $child)
{
return (new Query())
->from($this->itemChildTable)
->where(['parent' => $parent->name, 'child' => $child->name])
->one($this->db) !== false;
}
定義元: yii\base\Component::hasEventHandlers()
名前付きイベントにアタッチされたハンドラーがあるかどうかを示す値を返します。
public boolean hasEventHandlers ( $name ) | ||
$name | string |
イベント名 |
return | 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);
}
定義元: yii\base\Component::hasMethod()
メソッドが定義されているかどうかを示す値を返します。
メソッドが定義されているのは以下の場合です。
- クラスが指定された名前のメソッドを持っている
- アタッチされたビヘイビアが指定された名前のメソッドを持っている(
$checkBehaviors
が true の場合)。
public boolean hasMethod ( $name, $checkBehaviors = true ) | ||
$name | string |
プロパティ名 |
$checkBehaviors | boolean |
ビヘイビアのメソッドをこのコンポーネントのメソッドとして扱うかどうか |
return | 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;
}
定義元: yii\rbac\BaseManager::hasNoAssignments()
$assignmentsの配列が空かどうか、および$defaultRolesプロパティも空かどうかをチェックします。
protected boolean hasNoAssignments ( array $assignments ) | ||
$assignments | yii\rbac\Assignment[] |
ユーザーのアサインメントの配列 |
return | boolean |
$assignments の配列が空で、かつ $defaultRoles プロパティも空かどうか |
---|
protected function hasNoAssignments(array $assignments)
{
return empty($assignments) && empty($this->defaultRoles);
}
定義元: yii\base\Component::hasProperty()
プロパティがこのコンポーネントで定義されているかどうかを示す値を返します。
プロパティが定義されているのは以下の場合です。
- クラスが指定された名前に関連付けられたゲッターまたはセッターメソッドを持っている(この場合、プロパティ名は case-insensitive です)。
- クラスに、指定された名前のメンバ変数がある場合(
$checkVars
がtrueの場合)。 - アタッチされたビヘイビアが指定された名前のプロパティを持っている(
$checkBehaviors
が true の場合)。
こちらも参照
public boolean hasProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバ変数をプロパティとして扱うかどうか |
$checkBehaviors | boolean |
ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか |
return | boolean |
プロパティが定義されているかどうか |
---|
public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}
アプリケーションコンポーネントを初期化します。
このメソッドは、データベース接続を確立することにより、親の実装をオーバーライドします。
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');
}
}
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 = [];
}
$userIdが空かどうかをチェックします。
protected boolean isEmptyUserId ( $userId ) | ||
$userId | mixed |
protected function isEmptyUserId($userId)
{
return !isset($userId) || $userId === '';
}
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]);
}
定義元: yii\base\Component::off()
既存のイベントハンドラーをこのコンポーネントから切り離します。
このメソッドは on() の反対です。
注意:イベント名にワイルドカードパターンが渡された場合、このワイルドカードで登録されたハンドラのみが削除され、このワイルドカードに一致するプレーン名で登録されたハンドラは残ります。
on() も参照してください。
public boolean off ( $name, $handler = null ) | ||
$name | string |
イベント名 |
$handler | callable|null |
削除されるイベントハンドラ。null の場合、指定された名前のイベントにアタッチされたすべてのハンドラが削除されます。 |
return | 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;
}
イベントにイベントハンドラーをアタッチします。
イベントハンドラは有効な 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]);
}
}
データベースからフェッチされたデータで認証項目を埋めます。
protected yii\rbac\Item populateItem ( $row ) | ||
$row | array |
auth_item テーブルからのデータ |
return | yii\rbac\Item |
設定された auth アイテムインスタンス (Role または Permission のいずれか) |
---|
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'],
]);
}
定義元: yii\rbac\BaseManager::remove()
RBACシステムからロール、パーミッション、またはルールを削除します。
public boolean remove ( $object ) | ||
$object | yii\rbac\Role|yii\rbac\Permission|yii\rbac\Rule | |
return | 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.');
}
ロール、パーミッション、ルール、および割り当てを含むすべての認証データを削除します。
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();
}
すべてのロール割り当てを削除します。
public void removeAllAssignments ( ) |
public function removeAllAssignments()
{
$this->checkAccessAssignments = [];
$this->db->createCommand()->delete($this->assignmentTable)->execute();
}
指定されたタイプのすべての認証項目を削除します。
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();
}
すべてのパーミッションを削除します。
すべての親子の関係は、それに応じて調整されます。
public void removeAllPermissions ( ) |
public function removeAllPermissions()
{
$this->removeAllItems(Item::TYPE_PERMISSION);
}
すべてのロールを削除します。
すべての親子の関係は、それに応じて調整されます。
public void removeAllRoles ( ) |
public function removeAllRoles()
{
$this->removeAllItems(Item::TYPE_ROLE);
}
すべてのルールを削除します。
ルールを持つすべてのロールとパーミッションは、それに応じて調整されます。
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();
}
子を親から削除します。
子アイテムは削除されないことに注意してください。親子関係のみが削除されます。
public boolean removeChild ( $parent, $child ) | ||
$parent | yii\rbac\Item | |
$child | yii\rbac\Item | |
return | 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;
}
すべての子を親から削除します。
子アイテムは削除されないことに注意してください。親子関係のみが削除されます。
public boolean removeChildren ( $parent ) | ||
$parent | yii\rbac\Item | |
return | boolean |
削除が成功したかどうか |
---|
public function removeChildren($parent)
{
$result = $this->db->createCommand()
->delete($this->itemChildTable, ['parent' => $parent->name])
->execute() > 0;
$this->invalidateCache();
return $result;
}
RBACシステムから認証項目を削除します。
protected boolean removeItem ( $item ) | ||
$item | yii\rbac\Item |
削除するアイテム |
return | boolean |
ロールまたはパーミッションが正常に削除されたかどうか |
---|---|---|
throws | 例外 |
データ検証または保存に失敗した場合(ロールまたはパーミッションの名前が一意でない場合など) |
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;
}
RBACシステムからルールを削除します。
protected boolean removeRule ( $rule ) | ||
$rule | yii\rbac\Rule |
削除するルール |
return | boolean |
ルールが正常に削除されたかどうか |
---|---|---|
throws | 例外 |
データ検証または保存に失敗した場合(ルールの名前が一意でない場合など) |
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;
}
ユーザーからロールを取り消します。
public boolean revoke ( $role, $userId ) | ||
$role | yii\rbac\Role|yii\rbac\Permission | |
$userId | string|integer |
ユーザーID(yii\web\User::$idを参照) |
return | 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;
}
ユーザーからすべてのロールを取り消します。
public boolean revokeAll ( $userId ) | ||
$userId | mixed |
ユーザーID(yii\web\User::$idを参照) |
return | 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;
}
定義場所: yii\rbac\BaseManager::setDefaultRoles()
デフォルトのロールを設定します。
public void setDefaultRoles ( $roles ) | ||
$roles | string[]|Closure |
ロールの配列、またはそれを返す callable のいずれか |
throws | yii\base\InvalidArgumentException |
$roles が配列でも Closure でもない場合 |
---|---|---|
throws | 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');
}
}
データベースがカスケード更新および削除をサポートするかどうかを示す値を返します。
デフォルトの実装では、SQLite データベースの場合は false を返し、他のすべてのデータベースの場合は true を返します。
protected boolean supportsCascadeUpdate ( ) | ||
return | boolean |
データベースがカスケード更新と削除をサポートするかどうか。 |
---|
protected function supportsCascadeUpdate()
{
return strncmp($this->db->getDriverName(), 'sqlite', 6) !== 0;
}
定義元: 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);
}
定義元: yii\rbac\BaseManager::update()
システム内の指定されたロール、パーミッション、またはルールを更新します。
public boolean update ( $name, $object ) | ||
$name | string |
ロール、パーミッション、またはルールの古い名前 |
$object | yii\rbac\Role|yii\rbac\Permission|yii\rbac\Rule | |
return | boolean |
更新が成功したかどうか |
---|---|---|
throws | 例外 |
データ検証または保存に失敗した場合(ロールまたはパーミッションの名前が一意でない場合など) |
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.');
}
RBACシステム内の認証項目を更新します。
protected boolean updateItem ( $name, $item ) | ||
$name | string |
更新されるアイテムの名前 |
$item | yii\rbac\Item |
更新されたアイテム |
return | boolean |
認証アイテムが正常に更新されたかどうか |
---|---|---|
throws | 例外 |
データ検証または保存に失敗した場合(ロールまたはパーミッションの名前が一意でない場合など) |
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;
}
ルールをRBACシステムに更新します。
protected boolean updateRule ( $name, $rule ) | ||
$name | string |
更新されるルールの名前 |
$rule | yii\rbac\Rule |
更新されたルール |
return | boolean |
ルールが正常に更新されたかどうか |
---|---|---|
throws | 例外 |
データ検証または保存に失敗した場合(ルールの名前が一意でない場合など) |
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;
}
サインアップ または ログイン してコメントしてください。