diff --git a/src/Routing/PendingRelationshipRegistration.php b/src/Routing/PendingRelationshipRegistration.php index d0a5934..7214bde 100644 --- a/src/Routing/PendingRelationshipRegistration.php +++ b/src/Routing/PendingRelationshipRegistration.php @@ -164,6 +164,20 @@ public function middleware(string ...$middleware): self return $this; } + + + /** + * Add middleware to the resource routes. + * + * @param Closure|array $middleware + * @return $this + */ + public function routeActionMiddleware(array|\Closure $middleware): self + { + $this->options['route_action_middleware'] = $middleware; + + return $this; + } /** * Specify middleware that should be removed from the resource routes. diff --git a/src/Routing/PendingResourceRegistration.php b/src/Routing/PendingResourceRegistration.php index d07c8f3..77a4313 100644 --- a/src/Routing/PendingResourceRegistration.php +++ b/src/Routing/PendingResourceRegistration.php @@ -189,6 +189,20 @@ public function middleware(string ...$middleware): self return $this; } + + + /** + * Add middleware to the resource routes. + * + * @param Closure|array $middleware + * @return $this + */ + public function routeActionMiddleware(array|Closure $middleware): self + { + $this->options['route_action_middleware'] = $middleware; + + return $this; + } /** * Specify middleware that should be removed from the resource routes. diff --git a/src/Routing/RelationshipRegistrar.php b/src/Routing/RelationshipRegistrar.php index a9aae8a..83b0a0b 100644 --- a/src/Routing/RelationshipRegistrar.php +++ b/src/Routing/RelationshipRegistrar.php @@ -276,10 +276,27 @@ private function getRelationshipAction( if (isset($options['middleware'])) { $action['middleware'] = $options['middleware']; } - + if (isset($options['excluded_middleware'])) { $action['excluded_middleware'] = $options['excluded_middleware']; } + if (isset($options['route_action_middleware'])) { + /** @var \closure|array $routeMiddlewareMap */ + $routeMiddlewareMap = $options['route_action_middleware']; + /** @var string|string[] $routeActionMiddleware */ + $routeActionMiddleware = is_callable($routeMiddlewareMap) ? $routeMiddlewareMap( + Str::classify($this->resourceType), + Str::classify($method), + Str::classify($defaultName) + ) : ($routeMiddlewareMap[$method] ?? []); + /** @var string[] $newMiddleware */ + $newMiddleware = is_array($routeActionMiddleware) ? $routeActionMiddleware : [$routeActionMiddleware]; + /** @var string[] $oldMiddleware */ + $oldMiddleware = $action['middleware'] ?? []; + + // dd($oldMiddleware, $routeActionMiddleware); + $action['middleware'] = array_merge($oldMiddleware, $newMiddleware); + } return $action; } diff --git a/src/Routing/ResourceRegistrar.php b/src/Routing/ResourceRegistrar.php index bde73d8..397c882 100644 --- a/src/Routing/ResourceRegistrar.php +++ b/src/Routing/ResourceRegistrar.php @@ -349,6 +349,23 @@ private function getResourceAction( if (isset($options['excluded_middleware'])) { $action['excluded_middleware'] = $options['excluded_middleware']; } + + if (isset($options['route_action_middleware'])) { + /** @var \closure|array $routeMiddlewareMap */ + $routeMiddlewareMap = $options['route_action_middleware']; + /** @var string|string[] $routeActionMiddleware */ + $routeActionMiddleware = is_callable($routeMiddlewareMap) ? $routeMiddlewareMap( + Str::classify($resourceType), + Str::classify($method), + ) : ($routeMiddlewareMap[$method] ?? []); + /** @var string[] $newMiddleware */ + $newMiddleware = is_array($routeActionMiddleware) ? $routeActionMiddleware : [$routeActionMiddleware]; + /** @var string[] $oldMiddleware */ + $oldMiddleware = $action['middleware'] ?? []; + + // dd($oldMiddleware, $routeActionMiddleware); + $action['middleware'] = array_merge($oldMiddleware, $newMiddleware); + } $action['where'] = $this->getWheres($resourceType, $parameter, $options);