Skip to content

Commit 8b2b0b8

Browse files
Support additional methods in custom form requests (#169)
1 parent bf11436 commit 8b2b0b8

6 files changed

Lines changed: 144 additions & 88 deletions

File tree

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace DuncanMcClean\Cargo\Exceptions;
4+
5+
use Exception;
6+
7+
class FormRequestDoesNotExist extends Exception
8+
{
9+
//
10+
}

src/Http/Requests/Cart/AddLineItemRequest.php

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,16 @@
33
namespace DuncanMcClean\Cargo\Http\Requests\Cart;
44

55
use DuncanMcClean\Cargo\Facades\Product;
6-
use DuncanMcClean\Cargo\Http\Requests\Concerns\AcceptsCustomFormRequests;
7-
use Illuminate\Foundation\Http\FormRequest;
6+
use DuncanMcClean\Cargo\Http\Requests\CustomizableFormRequest;
87
use Illuminate\Support\Traits\Localizable;
98
use Illuminate\Validation\Rule;
109
use Statamic\Facades\Site;
1110

12-
class AddLineItemRequest extends FormRequest
11+
class AddLineItemRequest extends CustomizableFormRequest
1312
{
14-
use AcceptsCustomFormRequests, Localizable;
13+
use Localizable;
1514

16-
public function authorize()
17-
{
18-
if ($this->hasCustomFormRequest()) {
19-
return $this->resolveCustomFormRequest()->authorize();
20-
}
21-
22-
return true;
23-
}
24-
25-
public function rules()
15+
public function rules(): array
2616
{
2717
if ($this->hasCustomFormRequest()) {
2818
return $this->resolveCustomFormRequest()->rules();

src/Http/Requests/Cart/UpdateCartRequest.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,22 @@
44

55
use DuncanMcClean\Cargo\Facades\Cart;
66
use DuncanMcClean\Cargo\Facades\Order;
7-
use DuncanMcClean\Cargo\Http\Requests\Concerns\AcceptsCustomFormRequests;
7+
use DuncanMcClean\Cargo\Http\Requests\CustomizableFormRequest;
88
use DuncanMcClean\Cargo\Rules\ValidDiscountCode;
99
use Illuminate\Contracts\Validation\Validator;
10-
use Illuminate\Foundation\Http\FormRequest;
1110
use Illuminate\Support\Traits\Localizable;
1211
use Illuminate\Validation\ValidationException;
1312
use Statamic\Exceptions\NotFoundHttpException;
1413
use Statamic\Facades\Site;
1514
use Statamic\Facades\URL;
1615

17-
class UpdateCartRequest extends FormRequest
16+
class UpdateCartRequest extends CustomizableFormRequest
1817
{
19-
use AcceptsCustomFormRequests, Localizable;
18+
use Localizable;
2019

2120
private $cachedFields;
2221

23-
public function authorize()
22+
public function authorize(): bool
2423
{
2524
throw_if(! Cart::hasCurrentCart(), NotFoundHttpException::class);
2625

@@ -31,9 +30,6 @@ public function authorize()
3130
return true;
3231
}
3332

34-
/**
35-
* Optionally override the redirect url based on the presence of _error_redirect
36-
*/
3733
protected function getRedirectUrl()
3834
{
3935
$url = $this->redirector->getUrlGenerator();
@@ -47,8 +43,12 @@ protected function getRedirectUrl()
4743
return $url->previous();
4844
}
4945

50-
public function rules()
46+
public function rules(): array
5147
{
48+
if ($this->hasCustomFormRequest()) {
49+
return $this->resolveCustomFormRequest()->rules();
50+
}
51+
5252
$fields = $this->getFormFields();
5353

5454
return $fields

src/Http/Requests/Cart/UpdateLineItemRequest.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,16 @@
33
namespace DuncanMcClean\Cargo\Http\Requests\Cart;
44

55
use DuncanMcClean\Cargo\Facades\Cart;
6-
use DuncanMcClean\Cargo\Http\Requests\Concerns\AcceptsCustomFormRequests;
7-
use Illuminate\Foundation\Http\FormRequest;
6+
use DuncanMcClean\Cargo\Http\Requests\CustomizableFormRequest;
87
use Illuminate\Support\Traits\Localizable;
98
use Statamic\Exceptions\NotFoundHttpException;
109
use Statamic\Facades\Site;
1110

12-
class UpdateLineItemRequest extends FormRequest
11+
class UpdateLineItemRequest extends CustomizableFormRequest
1312
{
14-
use AcceptsCustomFormRequests, Localizable;
13+
use Localizable;
1514

16-
public function authorize()
15+
public function authorize(): bool
1716
{
1817
throw_if(! Cart::hasCurrentCart(), NotFoundHttpException::class);
1918

@@ -24,7 +23,7 @@ public function authorize()
2423
return true;
2524
}
2625

27-
public function rules()
26+
public function rules(): array
2827
{
2928
if ($this->hasCustomFormRequest()) {
3029
return $this->resolveCustomFormRequest()->rules();

src/Http/Requests/Concerns/AcceptsCustomFormRequests.php

Lines changed: 0 additions & 59 deletions
This file was deleted.
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<?php
2+
3+
namespace DuncanMcClean\Cargo\Http\Requests;
4+
5+
use DuncanMcClean\Cargo\Exceptions\FormRequestDoesNotExist;
6+
use Illuminate\Contracts\Validation\Validator;
7+
use Illuminate\Foundation\Http\FormRequest;
8+
9+
abstract class CustomizableFormRequest extends FormRequest
10+
{
11+
private ?FormRequest $customFormRequestInstance = null;
12+
13+
public function authorize(): bool
14+
{
15+
if ($this->hasCustomFormRequest()) {
16+
return $this->resolveCustomFormRequest()->authorize();
17+
}
18+
19+
return true;
20+
}
21+
22+
public function rules(): array
23+
{
24+
if ($this->hasCustomFormRequest()) {
25+
return $this->resolveCustomFormRequest()->rules();
26+
}
27+
28+
return [];
29+
}
30+
31+
public function messages(): array
32+
{
33+
if ($this->hasCustomFormRequest()) {
34+
return $this->resolveCustomFormRequest()->messages();
35+
}
36+
37+
return [];
38+
}
39+
40+
public function attributes(): array
41+
{
42+
if ($this->hasCustomFormRequest()) {
43+
return $this->resolveCustomFormRequest()->attributes();
44+
}
45+
46+
return [];
47+
}
48+
49+
protected function prepareForValidation(): void
50+
{
51+
if (! $this->hasCustomFormRequest()) {
52+
return;
53+
}
54+
55+
$customRequest = $this->resolveCustomFormRequest();
56+
57+
if (method_exists($customRequest, 'prepareForValidation')) {
58+
$customRequest->prepareForValidation();
59+
$this->merge($customRequest->all());
60+
}
61+
}
62+
63+
public function withValidator(Validator $validator): void
64+
{
65+
if (! $this->hasCustomFormRequest()) {
66+
return;
67+
}
68+
69+
$customRequest = $this->resolveCustomFormRequest();
70+
71+
if (method_exists($customRequest, 'withValidator')) {
72+
$customRequest->withValidator($validator);
73+
}
74+
}
75+
76+
protected function passedValidation(): void
77+
{
78+
if (! $this->hasCustomFormRequest()) {
79+
return;
80+
}
81+
82+
$customRequest = $this->resolveCustomFormRequest();
83+
84+
if (method_exists($customRequest, 'passedValidation')) {
85+
$customRequest->passedValidation();
86+
}
87+
}
88+
89+
protected function hasCustomFormRequest(): bool
90+
{
91+
return $this->has('_request');
92+
}
93+
94+
protected function resolveCustomFormRequest(): FormRequest
95+
{
96+
if ($this->customFormRequestInstance) {
97+
return $this->customFormRequestInstance;
98+
}
99+
100+
$formRequest = decrypt($this->input('_request'));
101+
102+
if (! class_exists($formRequest)) {
103+
throw new FormRequestDoesNotExist("Form Request [{$formRequest}] does not exist.");
104+
}
105+
106+
return $this->customFormRequestInstance = app($formRequest, [
107+
$this->query(),
108+
$this->all(),
109+
$this->attributes->all(),
110+
$this->cookies->all(),
111+
$this->files->all(),
112+
$this->server->all(),
113+
$this->content,
114+
]);
115+
}
116+
}

0 commit comments

Comments
 (0)