From 506d61ad897ca577fcfa373306f23a9e94f75618 Mon Sep 17 00:00:00 2001 From: Ayman Abi Aoun Date: Sat, 1 Jun 2024 18:30:03 +0300 Subject: [PATCH 1/2] feat: Allow creating FormRequests by methods --- .../Controllers/Actions/AttachRelationship.php | 4 +++- .../Controllers/Actions/DetachRelationship.php | 4 +++- src/Http/Controllers/Actions/Store.php | 4 +++- src/Http/Controllers/Actions/Update.php | 4 +++- .../Controllers/Actions/UpdateRelationship.php | 4 +++- src/Http/Requests/RequestMethod.php | 15 +++++++++++++++ src/Http/Requests/RequestResolver.php | 10 +++++++++- src/Http/Requests/ResourceRequest.php | 6 ++++-- 8 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 src/Http/Requests/RequestMethod.php diff --git a/src/Http/Controllers/Actions/AttachRelationship.php b/src/Http/Controllers/Actions/AttachRelationship.php index eeaa6f6..2672f85 100644 --- a/src/Http/Controllers/Actions/AttachRelationship.php +++ b/src/Http/Controllers/Actions/AttachRelationship.php @@ -16,6 +16,7 @@ use LaravelJsonApi\Contracts\Routing\Route; use LaravelJsonApi\Contracts\Store\Store as StoreContract; use LaravelJsonApi\Core\Support\Str; +use LaravelJsonApi\Laravel\Http\Requests\RequestMethod; use LaravelJsonApi\Laravel\Http\Requests\ResourceQuery; use LaravelJsonApi\Laravel\Http\Requests\ResourceRequest; use LogicException; @@ -41,7 +42,8 @@ public function attachRelationship(Route $route, StoreContract $store) } $request = ResourceRequest::forResource( - $resourceType = $route->resourceType() + $resourceType = $route->resourceType(), + RequestMethod::ATTACH_RELATIONSHIP ); $query = ResourceQuery::queryMany($relation->inverse()); diff --git a/src/Http/Controllers/Actions/DetachRelationship.php b/src/Http/Controllers/Actions/DetachRelationship.php index 4febd0a..d1b8ddd 100644 --- a/src/Http/Controllers/Actions/DetachRelationship.php +++ b/src/Http/Controllers/Actions/DetachRelationship.php @@ -16,6 +16,7 @@ use LaravelJsonApi\Contracts\Routing\Route; use LaravelJsonApi\Contracts\Store\Store as StoreContract; use LaravelJsonApi\Core\Support\Str; +use LaravelJsonApi\Laravel\Http\Requests\RequestMethod; use LaravelJsonApi\Laravel\Http\Requests\ResourceQuery; use LaravelJsonApi\Laravel\Http\Requests\ResourceRequest; use LogicException; @@ -41,7 +42,8 @@ public function detachRelationship(Route $route, StoreContract $store) } $request = ResourceRequest::forResource( - $resourceType = $route->resourceType() + $resourceType = $route->resourceType(), + RequestMethod::DETACH_RELATIONSHIP ); $query = ResourceQuery::queryMany($relation->inverse()); diff --git a/src/Http/Controllers/Actions/Store.php b/src/Http/Controllers/Actions/Store.php index 07a5fd7..5fa2fa8 100644 --- a/src/Http/Controllers/Actions/Store.php +++ b/src/Http/Controllers/Actions/Store.php @@ -16,6 +16,7 @@ use LaravelJsonApi\Contracts\Routing\Route; use LaravelJsonApi\Contracts\Store\Store as StoreContract; use LaravelJsonApi\Core\Responses\DataResponse; +use LaravelJsonApi\Laravel\Http\Requests\RequestMethod; use LaravelJsonApi\Laravel\Http\Requests\ResourceQuery; use LaravelJsonApi\Laravel\Http\Requests\ResourceRequest; @@ -32,7 +33,8 @@ trait Store public function store(Route $route, StoreContract $store) { $request = ResourceRequest::forResource( - $resourceType = $route->resourceType() + $resourceType = $route->resourceType(), + RequestMethod::STORE ); $query = ResourceQuery::queryOne($resourceType); diff --git a/src/Http/Controllers/Actions/Update.php b/src/Http/Controllers/Actions/Update.php index b65c0d5..3b408e4 100644 --- a/src/Http/Controllers/Actions/Update.php +++ b/src/Http/Controllers/Actions/Update.php @@ -16,6 +16,7 @@ use LaravelJsonApi\Contracts\Routing\Route; use LaravelJsonApi\Contracts\Store\Store as StoreContract; use LaravelJsonApi\Core\Responses\DataResponse; +use LaravelJsonApi\Laravel\Http\Requests\RequestMethod; use LaravelJsonApi\Laravel\Http\Requests\ResourceQuery; use LaravelJsonApi\Laravel\Http\Requests\ResourceRequest; @@ -32,7 +33,8 @@ trait Update public function update(Route $route, StoreContract $store) { $request = ResourceRequest::forResource( - $resourceType = $route->resourceType() + $resourceType = $route->resourceType(), + RequestMethod::UPDATE ); $query = ResourceQuery::queryOne($resourceType); diff --git a/src/Http/Controllers/Actions/UpdateRelationship.php b/src/Http/Controllers/Actions/UpdateRelationship.php index 245a6eb..ca75284 100644 --- a/src/Http/Controllers/Actions/UpdateRelationship.php +++ b/src/Http/Controllers/Actions/UpdateRelationship.php @@ -17,6 +17,7 @@ use LaravelJsonApi\Contracts\Store\Store as StoreContract; use LaravelJsonApi\Core\Responses\RelationshipResponse; use LaravelJsonApi\Core\Support\Str; +use LaravelJsonApi\Laravel\Http\Requests\RequestMethod; use LaravelJsonApi\Laravel\Http\Requests\ResourceQuery; use LaravelJsonApi\Laravel\Http\Requests\ResourceRequest; @@ -37,7 +38,8 @@ public function updateRelationship(Route $route, StoreContract $store) ->relationship($fieldName = $route->fieldName()); $request = ResourceRequest::forResource( - $resourceType = $route->resourceType() + $resourceType = $route->resourceType(), + RequestMethod::UPDATE_RELATIONSHIP ); $query = $relation->toOne() ? diff --git a/src/Http/Requests/RequestMethod.php b/src/Http/Requests/RequestMethod.php new file mode 100644 index 0000000..4a69b11 --- /dev/null +++ b/src/Http/Requests/RequestMethod.php @@ -0,0 +1,15 @@ +make(SchemaContainer::class)->schemaFor($resourceType) )); + if ($requestMethod) { + $requestFqn = Str::replaceLast($resourceType, $requestMethod->value . $resourceType, $fqn); + if (class_exists($requestFqn) || $app->bound($requestFqn)) { + $fqn = $requestFqn; + } + } + if (!class_exists($fqn) && !$app->bound($fqn)) { if (true === $allowNull) { return null; diff --git a/src/Http/Requests/ResourceRequest.php b/src/Http/Requests/ResourceRequest.php index 7a0a267..45ea8d6 100644 --- a/src/Http/Requests/ResourceRequest.php +++ b/src/Http/Requests/ResourceRequest.php @@ -11,6 +11,7 @@ namespace LaravelJsonApi\Laravel\Http\Requests; +use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Contracts\Validation\Factory as ValidationFactory; use Illuminate\Contracts\Validation\Validator; use Illuminate\Database\Eloquent\Model; @@ -62,13 +63,14 @@ public static function guessResourceRequestUsing(callable $resolver): void * Resolve the request instance for the specified resource type. * * @param string $resourceType + * @param RequestMethod|null $requestMethod * @return ResourceRequest */ - public static function forResource(string $resourceType): ResourceRequest + public static function forResource(string $resourceType, RequestMethod $requestMethod = null): ResourceRequest { $resolver = self::$requestResolver ?: new RequestResolver(RequestResolver::REQUEST); - return $resolver($resourceType); + return $resolver($resourceType, false, $requestMethod); } /** From 1ee6914a3bca9bac171e84e8e89ae76936c5ce15 Mon Sep 17 00:00:00 2001 From: Ayman Abi Aoun Date: Sat, 1 Jun 2024 18:41:13 +0300 Subject: [PATCH 2/2] feat: git ignored .idea/ folder --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9448440..57a1e71 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ vendor/ composer.lock .phpunit.cache/ +.idea/