Completed
Push — master ( c83b97...9053c3 )
by Alexey
04:03
created

ModuleTrait::addChild()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 9
c 0
b 0
f 0
dl 0
loc 15
rs 9.9666
cc 3
nc 3
nop 2
1
<?php
2
3
namespace modules\rbac\traits;
4
5
use Yii;
6
use modules\rbac\Module;
7
use yii\rbac\Permission;
8
use yii\rbac\Role;
9
use yii\base\Exception;
10
11
/**
12
 * Trait ModuleTrait
13
 *
14
 * @property-read Module $module
15
 * @package modules\rbac\traits
16
 */
17
trait ModuleTrait
18
{
19
    /**
20
     * @return null|\yii\base\Module
21
     */
22
    public function getModule()
23
    {
24
        return Yii::$app->getModule('rbac');
25
    }
26
27
    /**
28
     * @param $permissions
29
     * @param $role
30
     * @throws Exception
31
     */
32
    public static function addChild($permissions, $role)
33
    {
34
        /** @var  $auth */
35
        $auth = Yii::$app->authManager;
36
        foreach ($permissions as $value) {
37
            /** @var Permission|Role $add */
38
            $add = $auth->getPermission($value);
39
            // Проверяем, не является добовляемое разрешение родителем?
40
            $result = self::detectLoop($role, $add);
41
            if (!$result) {
42
                $auth->addChild($role, $add);
43
            } else {
44
                /** @var yii\web\Session $session */
45
                $session = Yii::$app->session;
46
                $session->setFlash('error', Module::t('module', 'The permission of the "{:parent}" is the parent of the "{:permission}"!', [':parent' => $add->name, ':permission' => $role->name]));
47
            }
48
        }
49
    }
50
51
    /**
52
     * @param object $parent
53
     * @param object $child
54
     * @return bool
55
     */
56
    protected static function detectLoop($parent, $child)
57
    {
58
        $auth = Yii::$app->authManager;
59
        if ($child->name === $parent->name) {
60
            return true;
61
        }
62
        foreach ($auth->getChildren($child->name) as $grandchild) {
63
            if (self::detectLoop($parent, $grandchild)) {
64
                return true;
65
            }
66
        }
67
        return false;
68
    }
69
}
70