@@ -28,6 +28,8 @@ class AclService
28
28
29
29
private Cache $ roleNamesCache ;
30
30
31
+ private Cache $ roleNameBySystemNameCache ;
32
+
31
33
private Cache $ permissionNamesCache ;
32
34
33
35
private Cache $ resourceNamesCache ;
@@ -39,9 +41,10 @@ public function __construct(
39
41
private readonly Translator $ translator ,
40
42
Storage $ storage ,
41
43
) {
42
- $ this ->roleNamesCache = new Cache ($ storage , 'RoleNames ' );
43
- $ this ->permissionNamesCache = new Cache ($ storage , 'PermissionNames ' );
44
- $ this ->resourceNamesCache = new Cache ($ storage , 'ResourceNames ' );
44
+ $ this ->roleNamesCache = new Cache ($ storage , 'RoleNames ' );
45
+ $ this ->roleNameBySystemNameCache = new Cache ($ storage , 'RoleNamesBySystemName ' );
46
+ $ this ->permissionNamesCache = new Cache ($ storage , 'PermissionNames ' );
47
+ $ this ->resourceNamesCache = new Cache ($ storage , 'ResourceNames ' );
45
48
}
46
49
47
50
/**
@@ -53,17 +56,21 @@ public function __construct(
53
56
*/
54
57
public function findAllRoleNames (): array
55
58
{
56
- $ names = $ this ->roleNamesCache ->load (null );
57
- if ($ names === null ) {
59
+ return $ this ->roleNamesCache ->load (null , function () {
58
60
$ names = $ this ->roleRepository ->createQueryBuilder ('r ' )
59
- ->select ('r.name ' )
60
- ->getQuery ()
61
- ->getScalarResult ();
62
- $ names = array_map ('current ' , $ names );
63
- $ this ->roleNamesCache ->save (null , $ names );
64
- }
61
+ ->select ('r.name ' )
62
+ ->getQuery ()
63
+ ->getScalarResult ();
64
+
65
+ return array_map ('current ' , $ names );
66
+ });
67
+ }
65
68
66
- return $ names ;
69
+ public function findRoleNameBySystemName (string $ systemName ): string
70
+ {
71
+ return $ this ->roleNameBySystemNameCache ->load ($ systemName , function () use ($ systemName ) {
72
+ return $ this ->roleRepository ->findBySystemName ($ systemName )->getName ();
73
+ });
67
74
}
68
75
69
76
/**
@@ -73,6 +80,7 @@ public function saveRole(Role $role): void
73
80
{
74
81
$ this ->roleRepository ->save ($ role );
75
82
$ this ->roleNamesCache ->clean ([Cache::Namespaces => ['RoleNames ' ]]);
83
+ $ this ->roleNameBySystemNameCache ->clean ([Cache::Namespaces => ['RoleNamesBySystemName ' ]]);
76
84
$ this ->permissionNamesCache ->clean ([Cache::Namespaces => ['PermissionNames ' ]]);
77
85
}
78
86
@@ -83,6 +91,7 @@ public function removeRole(Role $role): void
83
91
{
84
92
$ this ->roleRepository ->remove ($ role );
85
93
$ this ->roleNamesCache ->clean ([Cache::Namespaces => ['RoleNames ' ]]);
94
+ $ this ->roleNameBySystemNameCache ->clean ([Cache::Namespaces => ['RoleNamesBySystemName ' ]]);
86
95
}
87
96
88
97
/**
@@ -250,16 +259,14 @@ public function getRolesOptionsWithCapacity(bool $registerableNowOnly, bool $inc
250
259
*/
251
260
public function findAllPermissionNames (): Collection
252
261
{
253
- $ names = $ this ->permissionNamesCache ->load (null );
254
- if ($ names === null ) {
255
- $ names = $ this ->permissionRepository ->createQueryBuilder ('p ' )
256
- ->select ('p.name ' )
257
- ->addSelect ('role.name AS roleName ' )->join ('p.roles ' , 'role ' )
258
- ->addSelect ('resource.name AS resourceName ' )->join ('p.resource ' , 'resource ' )
259
- ->getQuery ()
260
- ->getResult ();
261
- $ this ->permissionNamesCache ->save (null , $ names );
262
- }
262
+ $ names = $ this ->permissionNamesCache ->load (null , function () {
263
+ return $ this ->permissionRepository ->createQueryBuilder ('p ' )
264
+ ->select ('p.name ' )
265
+ ->addSelect ('role.name AS roleName ' )->join ('p.roles ' , 'role ' )
266
+ ->addSelect ('resource.name AS resourceName ' )->join ('p.resource ' , 'resource ' )
267
+ ->getQuery ()
268
+ ->getResult ();
269
+ });
263
270
264
271
return new ArrayCollection ($ names );
265
272
}
@@ -273,16 +280,13 @@ public function findAllPermissionNames(): Collection
273
280
*/
274
281
public function findAllResourceNames (): array
275
282
{
276
- $ names = $ this ->resourceNamesCache ->load (null );
277
- if ($ names === null ) {
283
+ return $ this ->resourceNamesCache ->load (null , function () {
278
284
$ names = $ this ->resourceRepository ->createQueryBuilder ('r ' )
279
285
->select ('r.name ' )
280
286
->getQuery ()
281
287
->getScalarResult ();
282
- $ names = array_map ('current ' , $ names );
283
- $ this ->resourceNamesCache ->save (null , $ names );
284
- }
285
288
286
- return $ names ;
289
+ return array_map ('current ' , $ names );
290
+ });
287
291
}
288
292
}
0 commit comments