22
33namespace MyCLabs \ACL \CascadeStrategy ;
44
5- use Doctrine \Common \Util \ClassUtils ;
65use Doctrine \ORM \EntityManager ;
76use MyCLabs \ACL \Model \Authorization ;
8- use MyCLabs \ACL \Model \CascadingResource ;
97use MyCLabs \ACL \Model \ResourceInterface ;
108use MyCLabs \ACL \Repository \AuthorizationRepository ;
9+ use MyCLabs \ACL \ResourceGraph \CascadingResourceGraphTraverser ;
1110use MyCLabs \ACL \ResourceGraph \ResourceGraphTraverser ;
11+ use MyCLabs \ACL \ResourceGraph \ResourceGraphTraverserDispatcher ;
1212
1313/**
1414 * Simple cascade: authorizations are cascaded from a resource to its sub-resources.
@@ -23,31 +23,28 @@ class SimpleCascadeStrategy implements CascadeStrategy
2323 private $ entityManager ;
2424
2525 /**
26- * @var ResourceGraphTraverser[]
26+ * @var ResourceGraphTraverserDispatcher
2727 */
28- private $ resourceGraphTraversers = [] ;
28+ private $ resourceGraphTraverser ;
2929
3030 public function __construct (EntityManager $ entityManager )
3131 {
3232 $ this ->entityManager = $ entityManager ;
33+
34+ $ this ->resourceGraphTraverser = new ResourceGraphTraverserDispatcher ();
35+ // Default traverser for CascadingResource
36+ $ this ->resourceGraphTraverser ->setResourceGraphTraverser (
37+ 'MyCLabs\ACL\Model\CascadingResource ' ,
38+ new CascadingResourceGraphTraverser ($ entityManager , $ this ->resourceGraphTraverser )
39+ );
3340 }
3441
3542 /**
3643 * {@inheritdoc}
3744 */
3845 public function cascadeAuthorization (Authorization $ authorization , ResourceInterface $ resource )
3946 {
40- // Find sub-resources
41- $ subResources = [];
42- if ($ resource instanceof CascadingResource) {
43- $ subResources = $ this ->getAllSubResources ($ resource );
44- } else {
45- $ traverser = $ this ->getResourceGraphTraverser (ClassUtils::getClass ($ resource ));
46-
47- if ($ traverser ) {
48- $ subResources = $ traverser ->getAllSubResources ($ resource );
49- }
50- }
47+ $ subResources = $ this ->resourceGraphTraverser ->getAllSubResources ($ resource );
5148
5249 // Cascade authorizations
5350 $ authorizations = [];
@@ -66,17 +63,7 @@ public function processNewResource(ResourceInterface $resource)
6663 /** @var AuthorizationRepository $repository */
6764 $ repository = $ this ->entityManager ->getRepository ('MyCLabs\ACL\Model\Authorization ' );
6865
69- // Find parent resources
70- $ parentResources = [];
71- if ($ resource instanceof CascadingResource) {
72- $ parentResources = $ this ->getAllParentResources ($ resource );
73- } else {
74- $ traverser = $ this ->getResourceGraphTraverser (ClassUtils::getClass ($ resource ));
75-
76- if ($ traverser ) {
77- $ parentResources = $ traverser ->getAllParentResources ($ resource );
78- }
79- }
66+ $ parentResources = $ this ->resourceGraphTraverser ->getAllParentResources ($ resource );
8067
8168 // Find root authorizations on the parent resources
8269 $ authorizationsToCascade = [];
@@ -97,76 +84,12 @@ public function processNewResource(ResourceInterface $resource)
9784 return $ authorizations ;
9885 }
9986
100- /**
101- * Get all parent resources recursively.
102- * @param CascadingResource $resource
103- * @return ResourceInterface[]
104- */
105- private function getAllParentResources (CascadingResource $ resource )
106- {
107- $ parents = [];
108-
109- foreach ($ resource ->getParentResources ($ this ->entityManager ) as $ parentResource ) {
110- $ parents [] = $ parentResource ;
111- if ($ parentResource instanceof CascadingResource) {
112- $ parents = array_merge ($ parents , $ this ->getAllParentResources ($ parentResource ));
113- }
114- }
115-
116- return $ this ->unique ($ parents );
117- }
118-
119- /**
120- * Get all sub-resources recursively.
121- * @param CascadingResource $resource
122- * @return ResourceInterface[]
123- */
124- private function getAllSubResources (CascadingResource $ resource )
125- {
126- $ subResources = [];
127-
128- foreach ($ resource ->getSubResources ($ this ->entityManager ) as $ subResource ) {
129- $ subResources [] = $ subResource ;
130- if ($ subResource instanceof CascadingResource) {
131- $ subResources = array_merge ($ subResources , $ this ->getAllSubResources ($ subResource ));
132- }
133- }
134-
135- return $ this ->unique ($ subResources );
136- }
137-
138- private function unique (array $ array )
139- {
140- $ result = [];
141-
142- foreach ($ array as $ item ) {
143- if (! in_array ($ item , $ result , true )) {
144- $ result [] = $ item ;
145- }
146- }
147-
148- return $ result ;
149- }
150-
15187 /**
15288 * @param string $entityClass
15389 * @param ResourceGraphTraverser $resourceGraphTraverser
15490 */
15591 public function setResourceGraphTraverser ($ entityClass , $ resourceGraphTraverser )
15692 {
157- $ this ->resourceGraphTraversers [$ entityClass ] = $ resourceGraphTraverser ;
158- }
159-
160- /**
161- * @param string $entityClass
162- * @return ResourceGraphTraverser|null
163- */
164- private function getResourceGraphTraverser ($ entityClass )
165- {
166- if (isset ($ this ->resourceGraphTraversers [$ entityClass ])) {
167- return $ this ->resourceGraphTraversers [$ entityClass ];
168- }
169-
170- return null ;
93+ $ this ->resourceGraphTraverser ->setResourceGraphTraverser ($ entityClass , $ resourceGraphTraverser );
17194 }
17295}
0 commit comments