diff --git a/resources/views/resources/form.blade.php b/resources/views/resources/form.blade.php index c454b7d8..ac1d7bf3 100644 --- a/resources/views/resources/form.blade.php +++ b/resources/views/resources/form.blade.php @@ -32,7 +32,7 @@ {{ __('Cancel') }} - @if($abilities['delete']) + @if($model->exists && $abilities['delete'])
@csrf diff --git a/src/Fields/Relation.php b/src/Fields/Relation.php index 17d86b49..0a336005 100644 --- a/src/Fields/Relation.php +++ b/src/Fields/Relation.php @@ -21,6 +21,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\Relation as EloquentRelation; use Illuminate\Http\Request; +use Illuminate\Routing\Events\RouteMatched; use Illuminate\Routing\Router; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Gate; @@ -35,6 +36,7 @@ abstract class Relation extends Field implements Form use AsForm; use RegistersRoutes { RegistersRoutes::registerRoutes as __registerRoutes; + RegistersRoutes::routeMatched as __routeMatched; } use ResolvesActions; use ResolvesFields; @@ -608,6 +610,39 @@ protected function routesRegistered(Request $request): void ]); } + /** + * Handle the route matched event. + */ + public function routeMatched(RouteMatched $event): void + { + $this->__routeMatched($event); + + $controller = $event->route->getController(); + + $controller->middleware($this->getRouteMiddleware()); + + $middleware = function (Request $request, Closure $next) use ($event): mixed { + $ability = match ($event->route->getActionMethod()) { + 'index' => 'viewAny', + 'show' => 'view', + 'create' => 'create', + 'store' => 'create', + 'edit' => 'update', + 'update' => 'update', + 'destroy' => 'delete', + default => $event->route->getActionMethod(), + }; + + Gate::allowIf($this->resolveAbility( + $ability, $request, $request->route('resourceModel'), $request->route($this->getRouteParameterName()) + )); + + return $next($request); + }; + + $controller->middleware([$middleware]); + } + /** * Resolve the ability. */ @@ -615,7 +650,7 @@ public function resolveAbility(string $ability, Request $request, Model $model, { $policy = Gate::getPolicyFor($model); - $ability .= Str::studly($this->getRelatedName()); + $ability .= Str::of($this->getModelAttribute())->singular()->studly()->value(); return is_null($policy) || ! method_exists($policy, $ability) diff --git a/src/Resources/Resource.php b/src/Resources/Resource.php index 0be6091f..ed66ccea 100644 --- a/src/Resources/Resource.php +++ b/src/Resources/Resource.php @@ -457,7 +457,7 @@ public function routeMatched(RouteMatched $event): void $controller->middleware($this->getRouteMiddleware()); - if ($this->getPolicy()) { + if (! is_null($this->getPolicy())) { $controller->authorizeResource($this->getModel(), 'resourceModel'); }