Skip to content

Commit b981ec1

Browse files
committed
feat: pass parent model to the hook methods in relationship controllers
1 parent 43198cb commit b981ec1

File tree

4 files changed

+228
-145
lines changed

4 files changed

+228
-145
lines changed

src/Concerns/HandlesRelationManyToManyOperations.php

Lines changed: 60 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,24 @@ trait HandlesRelationManyToManyOperations
2121
*/
2222
public function attach(Request $request, $parentKey)
2323
{
24-
$beforeHookResult = $this->beforeAttach($request, $parentKey);
24+
$parentQuery = $this->buildAttachParentFetchQuery($request, $parentKey);
25+
$parentEntity = $this->runAttachParentFetchQuery($request, $parentQuery, $parentKey);
26+
27+
$beforeHookResult = $this->beforeAttach($request, $parentEntity);
2528
if ($this->hookResponds($beforeHookResult)) {
2629
return $beforeHookResult;
2730
}
2831

29-
$parentQuery = $this->buildAttachParentFetchQuery($request, $parentKey);
30-
$parentEntity = $this->runAttachParentFetchQuery($request, $parentQuery, $parentKey);
31-
3232
$this->authorize('update', $parentEntity);
3333

34-
$attachResult = $this->performAttach($request, $parentEntity, $request->get('resources'), $request->get('duplicates', false));
34+
$attachResult = $this->performAttach(
35+
$request,
36+
$parentEntity,
37+
$request->get('resources'),
38+
$request->get('duplicates', false)
39+
);
3540

36-
$afterHookResult = $this->afterAttach($request, $attachResult);
41+
$afterHookResult = $this->afterAttach($request, $parentEntity, $attachResult);
3742
if ($this->hookResponds($afterHookResult)) {
3843
return $afterHookResult;
3944
}
@@ -49,10 +54,10 @@ public function attach(Request $request, $parentKey)
4954
* The hook is executed before attaching relation resource.
5055
*
5156
* @param Request $request
52-
* @param int|string $parentKey
57+
* @param Model $parentEntity
5358
* @return mixed
5459
*/
55-
protected function beforeAttach(Request $request, $parentKey)
60+
protected function beforeAttach(Request $request, Model $parentEntity)
5661
{
5762
return null;
5863
}
@@ -164,7 +169,9 @@ function ($resourceKey) use ($resourceModels, $resourceKeyName) {
164169
*/
165170
$resourceModel = $resourceModels->where($resourceKeyName, $resourceKey)->first();
166171

167-
return $resourceModel && (!$this->authorizationRequired() || Gate::forUser($this->resolveUser())->allows('view', $resourceModel));
172+
return $resourceModel && (!$this->authorizationRequired() || Gate::forUser(
173+
$this->resolveUser()
174+
)->allows('view', $resourceModel));
168175
},
169176
ARRAY_FILTER_USE_KEY
170177
);
@@ -198,10 +205,11 @@ protected function standardizePivotResourcesArray($resources)
198205
* The hook is executed after attaching relation resource.
199206
*
200207
* @param Request $request
208+
* @param Model $parentEntity
201209
* @param array $attachResult
202210
* @return mixed
203211
*/
204-
protected function afterAttach(Request $request, array &$attachResult)
212+
protected function afterAttach(Request $request, Model $parentEntity, array &$attachResult)
205213
{
206214
return null;
207215
}
@@ -215,19 +223,19 @@ protected function afterAttach(Request $request, array &$attachResult)
215223
*/
216224
public function detach(Request $request, $parentKey)
217225
{
218-
$beforeHookResult = $this->beforeDetach($request, $parentKey);
226+
$parentQuery = $this->buildDetachParentFetchQuery($request, $parentKey);
227+
$parentEntity = $this->runDetachParentFetchQuery($request, $parentQuery, $parentKey);
228+
229+
$beforeHookResult = $this->beforeDetach($request, $parentEntity);
219230
if ($this->hookResponds($beforeHookResult)) {
220231
return $beforeHookResult;
221232
}
222233

223-
$parentQuery = $this->buildDetachParentFetchQuery($request, $parentKey);
224-
$parentEntity = $this->runDetachParentFetchQuery($request, $parentQuery, $parentKey);
225-
226234
$this->authorize('update', $parentEntity);
227235

228236
$detachResult = $this->performDetach($request, $parentEntity, $request->get('resources'));
229237

230-
$afterHookResult = $this->afterDetach($request, $detachResult);
238+
$afterHookResult = $this->afterDetach($request, $parentEntity, $detachResult);
231239
if ($this->hookResponds($afterHookResult)) {
232240
return $afterHookResult;
233241
}
@@ -243,10 +251,10 @@ public function detach(Request $request, $parentKey)
243251
* The hook is executed before detaching relation resource.
244252
*
245253
* @param Request $request
246-
* @param int|string $parentKey
254+
* @param Model $parentEntity
247255
* @return mixed
248256
*/
249-
protected function beforeDetach(Request $request, $parentKey)
257+
protected function beforeDetach(Request $request, Model $parentEntity)
250258
{
251259
return null;
252260
}
@@ -297,10 +305,11 @@ protected function performDetach(Request $request, Model $parentEntity, array $r
297305
* The hook is executed after detaching relation resource.
298306
*
299307
* @param Request $request
308+
* @param Model $parentEntity
300309
* @param array $detachResult
301310
* @return mixed
302311
*/
303-
protected function afterDetach(Request $request, array &$detachResult)
312+
protected function afterDetach(Request $request, Model $parentEntity, array &$detachResult)
304313
{
305314
return null;
306315
}
@@ -314,19 +323,24 @@ protected function afterDetach(Request $request, array &$detachResult)
314323
*/
315324
public function sync(Request $request, $parentKey)
316325
{
317-
$beforeHookResult = $this->beforeSync($request, $parentKey);
326+
$parentQuery = $this->buildSyncParentFetchQuery($request, $parentKey);
327+
$parentEntity = $this->runSyncParentFetchQuery($request, $parentQuery, $parentKey);
328+
329+
$beforeHookResult = $this->beforeSync($request, $parentEntity);
318330
if ($this->hookResponds($beforeHookResult)) {
319331
return $beforeHookResult;
320332
}
321333

322-
$parentQuery = $this->buildSyncParentFetchQuery($request, $parentKey);
323-
$parentEntity = $this->runSyncParentFetchQuery($request, $parentQuery, $parentKey);
324-
325334
$this->authorize('update', $parentEntity);
326335

327-
$syncResult = $this->performSync($request, $parentEntity, $request->get('resources'), $request->get('detaching', true));
336+
$syncResult = $this->performSync(
337+
$request,
338+
$parentEntity,
339+
$request->get('resources'),
340+
$request->get('detaching', true)
341+
);
328342

329-
$afterHookResult = $this->afterSync($request, $syncResult);
343+
$afterHookResult = $this->afterSync($request, $parentEntity, $syncResult);
330344
if ($this->hookResponds($afterHookResult)) {
331345
return $afterHookResult;
332346
}
@@ -338,10 +352,10 @@ public function sync(Request $request, $parentKey)
338352
* The hook is executed before syncing relation resources.
339353
*
340354
* @param Request $request
341-
* @param int|string $parentKey
355+
* @param Model $parentEntity
342356
* @return mixed
343357
*/
344-
protected function beforeSync(Request $request, $parentKey)
358+
protected function beforeSync(Request $request, Model $parentEntity)
345359
{
346360
return null;
347361
}
@@ -398,10 +412,11 @@ protected function performSync(Request $request, Model $parentEntity, array $res
398412
* The hook is executed after syncing relation resources.
399413
*
400414
* @param Request $request
415+
* @param Model $parentEntity
401416
* @param array $syncResult
402417
* @return mixed
403418
*/
404-
protected function afterSync(Request $request, array &$syncResult)
419+
protected function afterSync(Request $request, Model $parentEntity, array &$syncResult)
405420
{
406421
return null;
407422
}
@@ -415,19 +430,19 @@ protected function afterSync(Request $request, array &$syncResult)
415430
*/
416431
public function toggle(Request $request, $parentKey)
417432
{
418-
$beforeHookResult = $this->beforeToggle($request, $parentKey);
433+
$parentQuery = $this->buildToggleParentFetchQuery($request, $parentKey);
434+
$parentEntity = $this->runToggleParentFetchQuery($request, $parentQuery, $parentKey);
435+
436+
$beforeHookResult = $this->beforeToggle($request, $parentEntity);
419437
if ($this->hookResponds($beforeHookResult)) {
420438
return $beforeHookResult;
421439
}
422440

423-
$parentQuery = $this->buildToggleParentFetchQuery($request, $parentKey);
424-
$parentEntity = $this->runToggleParentFetchQuery($request, $parentQuery, $parentKey);
425-
426441
$this->authorize('update', $parentEntity);
427442

428443
$toggleResult = $this->performToggle($request, $parentEntity, $request->get('resources'));
429444

430-
$afterHookResult = $this->afterToggle($request, $toggleResult);
445+
$afterHookResult = $this->afterToggle($request, $parentEntity, $toggleResult);
431446
if ($this->hookResponds($afterHookResult)) {
432447
return $afterHookResult;
433448
}
@@ -439,10 +454,10 @@ public function toggle(Request $request, $parentKey)
439454
* The hook is executed before toggling relation resources.
440455
*
441456
* @param Request $request
442-
* @param int|string $parentKey
457+
* @param Model $parentEntity
443458
* @return mixed
444459
*/
445-
protected function beforeToggle(Request $request, $parentKey)
460+
protected function beforeToggle(Request $request, Model $parentEntity)
446461
{
447462
return null;
448463
}
@@ -491,10 +506,11 @@ protected function performToggle(Request $request, Model $parentEntity, array $r
491506
* The hook is executed after toggling relation resources.
492507
*
493508
* @param Request $request
509+
* @param Model $parentEntity
494510
* @param array $toggleResult
495511
* @return mixed
496512
*/
497-
protected function afterToggle(Request $request, array &$toggleResult)
513+
protected function afterToggle(Request $request, Model $parentEntity, array &$toggleResult)
498514
{
499515
return null;
500516
}
@@ -509,22 +525,22 @@ protected function afterToggle(Request $request, array &$toggleResult)
509525
*/
510526
public function updatePivot(Request $request, $parentKey, $relatedKey)
511527
{
512-
$beforeHookResult = $this->beforeUpdatePivot($request, $relatedKey);
528+
$parentQuery = $this->buildUpdatePivotParentFetchQuery($request, $parentKey);
529+
$parentEntity = $this->runUpdatePivotParentFetchQuery($request, $parentQuery, $parentKey);
530+
531+
$beforeHookResult = $this->beforeUpdatePivot($request, $parentEntity);
513532
if ($this->hookResponds($beforeHookResult)) {
514533
return $beforeHookResult;
515534
}
516535

517-
$parentQuery = $this->buildUpdatePivotParentFetchQuery($request, $parentKey);
518-
$parentEntity = $this->runUpdatePivotParentFetchQuery($request, $parentQuery, $parentKey);
519-
520536
$query = $this->buildShowFetchQuery($request, $parentEntity, []);
521537
$entity = $this->runShowFetchQuery($request, $query, $parentEntity, $relatedKey);
522538

523539
$this->authorize('update', $entity);
524540

525541
$updateResult = $this->performUpdatePivot($request, $parentEntity, $relatedKey, $request->get('pivot', []));
526542

527-
$afterHookResult = $this->afterUpdatePivot($request, $updateResult);
543+
$afterHookResult = $this->afterUpdatePivot($request, $parentEntity, $updateResult);
528544
if ($this->hookResponds($afterHookResult)) {
529545
return $afterHookResult;
530546
}
@@ -540,10 +556,10 @@ public function updatePivot(Request $request, $parentKey, $relatedKey)
540556
* The hook is executed before updating relation resource pivot.
541557
*
542558
* @param Request $request
543-
* @param int|string $relatedKey
559+
* @param Model $parentEntity
544560
* @return mixed
545561
*/
546-
protected function beforeUpdatePivot(Request $request, $relatedKey)
562+
protected function beforeUpdatePivot(Request $request, Model $parentEntity)
547563
{
548564
return null;
549565
}
@@ -595,10 +611,11 @@ protected function performUpdatePivot(Request $request, Model $parentEntity, $re
595611
* The hook is executed after updating relation resource pivot.
596612
*
597613
* @param Request $request
614+
* @param Model $parentEntity
598615
* @param array $updateResult
599616
* @return mixed
600617
*/
601-
protected function afterUpdatePivot(Request $request, array &$updateResult)
618+
protected function afterUpdatePivot(Request $request, Model $parentEntity, array &$updateResult)
602619
{
603620
return null;
604621
}

src/Concerns/HandlesRelationOneToManyOperations.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public function associate(Request $request, $parentKey)
3939

4040
$entity = $this->runAssociateFetchQuery($request, $query, $parentEntity, $request->get('related_key'));
4141

42-
$afterHookResult = $this->afterAssociate($request, $entity);
42+
$afterHookResult = $this->afterAssociate($request, $parentEntity, $entity);
4343
if ($this->hookResponds($afterHookResult)) {
4444
return $afterHookResult;
4545
}
@@ -133,10 +133,11 @@ protected function performAssociate(Request $request, Model $parentEntity, Model
133133
* The hook is executed after associating relation resource.
134134
*
135135
* @param Request $request
136+
* @param Model $parentEntity
136137
* @param Model $entity
137138
* @return mixed
138139
*/
139-
protected function afterAssociate(Request $request, Model $entity)
140+
protected function afterAssociate(Request $request, Model $parentEntity, Model $entity)
140141
{
141142
return null;
142143
}
@@ -171,7 +172,7 @@ public function dissociate(Request $request, $parentKey, $relatedKey)
171172
$entity = $this->relationQueryBuilder->buildQuery($entity::query(), $request)
172173
->with($this->relationsResolver->requestedRelations($request))->first();
173174

174-
$afterHookResult = $this->afterDissociate($request, $entity);
175+
$afterHookResult = $this->afterDissociate($request, $parentEntity,$entity);
175176
if ($this->hookResponds($afterHookResult)) {
176177
return $afterHookResult;
177178
}
@@ -265,10 +266,11 @@ protected function performDissociate(Request $request, Model $parentEntity, Mode
265266
* The hook is executed after dissociating relation resource.
266267
*
267268
* @param Request $request
269+
* @param Model $parentEntity
268270
* @param Model $entity
269271
* @return mixed
270272
*/
271-
protected function afterDissociate(Request $request, Model $entity)
273+
protected function afterDissociate(Request $request, Model $parentEntity, Model $entity)
272274
{
273275
return null;
274276
}

0 commit comments

Comments
 (0)