1010use Orion \Concerns \HandlesRelationOneToManyOperations ;
1111use Orion \Concerns \HandlesRelationStandardBatchOperations ;
1212use Orion \Concerns \HandlesRelationStandardOperations ;
13+ use Orion \Contracts \ComponentsResolver ;
1314use Orion \Contracts \QueryBuilder ;
1415use Orion \Exceptions \BindingException ;
15- use Orion \Http \Requests \Request ;
1616
1717abstract class RelationController extends BaseController
1818{
@@ -23,6 +23,11 @@ abstract class RelationController extends BaseController
2323 */
2424 protected $ relation ;
2525
26+ /**
27+ * @var string|null $policy
28+ */
29+ protected $ parentPolicy ;
30+
2631 /**
2732 * The list of pivot fields that can be set upon relation resource creation or update.
2833 *
@@ -42,6 +47,11 @@ abstract class RelationController extends BaseController
4247 */
4348 protected $ relationQueryBuilder ;
4449
50+ /**
51+ * @var ComponentsResolver $parentComponentsResolver
52+ */
53+ protected $ parentComponentsResolver ;
54+
4555 /**
4656 * RelationController constructor.
4757 *
@@ -50,9 +60,14 @@ abstract class RelationController extends BaseController
5060 public function __construct ()
5161 {
5262 if (!$ this ->relation ) {
53- throw new BindingException ('Relation is not defined for ' . static ::class);
63+ throw new BindingException ('Relation is not defined for ' . static ::class);
5464 }
5565
66+ $ this ->parentComponentsResolver = App::makeWith (
67+ ComponentsResolver::class,
68+ ['resourceModelClass ' => $ this ->getModel (),]
69+ );
70+
5671 parent ::__construct ();
5772
5873 $ this ->relationQueryBuilder = App::makeWith (
@@ -66,6 +81,15 @@ public function __construct()
6681 );
6782 }
6883
84+ protected function bindComponents (): void
85+ {
86+ parent ::bindComponents ();
87+
88+ if ($ parentPolicy = $ this ->getParentPolicy ()) {
89+ $ this ->parentComponentsResolver ->bindPolicyClass ($ parentPolicy );
90+ }
91+ }
92+
6993 /**
7094 * Retrieves model related to resource.
7195 *
@@ -107,6 +131,25 @@ public function setRelation(string $relation): self
107131 return $ this ;
108132 }
109133
134+ /**
135+ * @return string|null
136+ */
137+ public function getParentPolicy (): ?string
138+ {
139+ return $ this ->parentPolicy ;
140+ }
141+
142+ /**
143+ * @param string $policy
144+ * @return $this
145+ */
146+ public function setParentPolicy (string $ policy ): self
147+ {
148+ $ this ->parentPolicy = $ policy ;
149+
150+ return $ this ;
151+ }
152+
110153 /**
111154 * Creates new Eloquent query builder of the relation on the given parent model.
112155 *
@@ -175,6 +218,25 @@ public function setRelationQueryBuilder(QueryBuilder $relationQueryBuilder): sel
175218 return $ this ;
176219 }
177220
221+ /**
222+ * @return ComponentsResolver
223+ */
224+ public function getParentComponentsResolver (): ComponentsResolver
225+ {
226+ return $ this ->parentComponentsResolver ;
227+ }
228+
229+ /**
230+ * @param ComponentsResolver $componentsResolver
231+ * @return $this
232+ */
233+ public function setParentComponentsResolver (ComponentsResolver $ componentsResolver ): self
234+ {
235+ $ this ->parentComponentsResolver = $ componentsResolver ;
236+
237+ return $ this ;
238+ }
239+
178240 /**
179241 * A qualified name of the field used to fetch parent resource from the database.
180242 *
0 commit comments