Skip to content
This repository was archived by the owner on Jul 3, 2020. It is now read-only.

Commit b459677

Browse files
committed
Merge pull request #325 from Wilt/patch-2
Improvements InMemoryRoleProvider
2 parents 64b9318 + 101c4b5 commit b459677

File tree

2 files changed

+50
-21
lines changed

2 files changed

+50
-21
lines changed

src/ZfcRbac/Role/InMemoryRoleProvider.php

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
namespace ZfcRbac\Role;
2020

21+
use Rbac\Role\RoleInterface;
2122
use Rbac\Role\HierarchicalRole;
2223
use Rbac\Role\Role;
2324

@@ -42,6 +43,15 @@
4243
class InMemoryRoleProvider implements RoleProviderInterface
4344
{
4445
/**
46+
* Role storage
47+
*
48+
* @var array
49+
*/
50+
private $roles = [];
51+
52+
/**
53+
* Roles config
54+
*
4555
* @var array
4656
*/
4757
private $rolesConfig = [];
@@ -62,34 +72,50 @@ public function getRoles(array $roleNames)
6272
$roles = [];
6373

6474
foreach ($roleNames as $roleName) {
65-
// If no config, we create a simple role with no permission
66-
if (!isset($this->rolesConfig[$roleName])) {
67-
$roles[] = new Role($roleName);
68-
continue;
69-
}
70-
71-
$roleConfig = $this->rolesConfig[$roleName];
75+
$roles[] = $this->getRole($roleName);
76+
}
77+
return $roles;
78+
}
7279

73-
if (isset($roleConfig['children'])) {
74-
$role = new HierarchicalRole($roleName);
75-
$childRoles = (array) $roleConfig['children'];
80+
/**
81+
* Get role by role name
82+
*
83+
* @param $roleName
84+
* @return RoleInterface
85+
*/
86+
protected function getRole($roleName)
87+
{
88+
if (isset($this->roles[$roleName])) {
89+
return $this->roles[$roleName];
90+
}
7691

77-
foreach ($this->getRoles($childRoles) as $childRole) {
78-
$role->addChild($childRole);
79-
}
80-
} else {
81-
$role = new Role($roleName);
82-
}
92+
// If no config, we create a simple role with no permission
93+
if (!isset($this->rolesConfig[$roleName])) {
94+
$role = new Role($roleName);
95+
$this->roles[$roleName] = $role;
96+
return $role;
97+
}
8398

84-
$permissions = isset($roleConfig['permissions']) ? $roleConfig['permissions'] : [];
99+
$roleConfig = $this->rolesConfig[$roleName];
85100

86-
foreach ($permissions as $permission) {
87-
$role->addPermission($permission);
101+
if (isset($roleConfig['children'])) {
102+
$role = new HierarchicalRole($roleName);
103+
$childRoles = (array)$roleConfig['children'];
104+
foreach ($childRoles as $childRole) {
105+
$childRole = $this->getRole($childRole);
106+
$role->addChild($childRole);
88107
}
108+
} else {
109+
$role = new Role($roleName);
110+
}
89111

90-
$roles[] = $role;
112+
$permissions = isset($roleConfig['permissions']) ? $roleConfig['permissions'] : [];
113+
foreach ($permissions as $permission) {
114+
$role->addPermission($permission);
91115
}
92116

93-
return $roles;
117+
$this->roles[$roleName] = $role;
118+
119+
return $role;
94120
}
95121
}

tests/ZfcRbacTest/Role/InMemoryRoleProviderTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,8 @@ public function testInMemoryProvider()
6363
$this->assertEquals('guest', $guestRole->getName());
6464
$this->assertFalse($guestRole->hasPermission('write'));
6565
$this->assertFalse($guestRole->hasPermission('delete'));
66+
67+
$this->assertSame($adminRole->getChildren()['member'], $memberRole);
68+
$this->assertSame($memberRole->getChildren()['guest'], $guestRole);
6669
}
6770
}

0 commit comments

Comments
 (0)