diff --git a/README.md b/README.md index 274127128a..aa42b80fb6 100644 --- a/README.md +++ b/README.md @@ -37,28 +37,22 @@ class User extends Authenticatable } ``` -### Define a Resource +### Create a Resource -To define a Resource Model, add the `Filament\Traits\FilamentResource` trait to your model. - -> Make note of the properties and methods added to the model example below for how to configure a resource. +To define a Resource, create a new resource file in `app/Filament/Resources` like the following `Page.php`: ```php Show::class, ]; } - - //... } ``` diff --git a/config/filament.php b/config/filament.php index 2ba9377e9e..29632f7dce 100644 --- a/config/filament.php +++ b/config/filament.php @@ -29,7 +29,7 @@ return [ 'features' => [ Features::registration(), - Features::resourceModels() + Features::resources() ], 'models' => [ diff --git a/routes/web.php b/routes/web.php index e8f4097aef..9c1c2b05b6 100644 --- a/routes/web.php +++ b/routes/web.php @@ -4,7 +4,7 @@ use Illuminate\Support\Facades\Route; use Filament\Features; use Filament\Http\Controllers\{ AssetController, - ResourceModelController, + ResourceController, }; // Assets @@ -32,8 +32,8 @@ Route::group(['middleware' => ['auth']], function () { // Dashboard Route::get('/', config('filament.livewire.dashboard'))->name('dashboard'); - // Resource Models - if (Features::hasResourceModels()) { - Route::get('/resources/{model}/{action?}/{id?}', ResourceModelController::class)->name('resource'); + // Resources + if (Features::hasResources()) { + Route::get('/resources/{resource}/{action?}/{id?}', ResourceController::class)->name('resource'); } }); \ No newline at end of file diff --git a/src/Contracts/Resource.php b/src/Contracts/Resource.php new file mode 100644 index 0000000000..e4f8dcd2f9 --- /dev/null +++ b/src/Contracts/Resource.php @@ -0,0 +1,8 @@ +map(function ($item) { + $resources_path = config('filament.resources', app_path('Filament/Resources')); + $models = collect(File::allFiles($resources_path))->map(function ($item) { $path = $item->getRelativePathName(); - $class = sprintf('\%s%s', - Container::getInstance()->getNamespace(), - strtr(substr($path, 0, strrpos($path, '.')), '/', '\\')); + $class = sprintf( + '\%s%s', + Container::getInstance()->getNamespace().'Filament\\Resources\\', + strtr(substr($path, 0, strrpos($path, '.')), '/', '\\') + ); return $class; - }) - ->filter(function ($class) { + })->filter(function ($class) { if (!class_exists($class)) { return false; } $reflection = new \ReflectionClass($class); - return $reflection->isSubclassOf(Model::class) && - in_array(FilamentResource::class, class_uses_recursive($class)) && - !$reflection->isAbstract(); + return $reflection->isSubclassOf(FilamentResource::class) && !$reflection->isAbstract(); })->mapWithKeys(function ($class) { return [class_basename($class) => $class]; }); diff --git a/src/FilamentResource.php b/src/FilamentResource.php new file mode 100644 index 0000000000..46fc79efa5 --- /dev/null +++ b/src/FilamentResource.php @@ -0,0 +1,17 @@ +bootModelBindings(); - $this->bootResources(); + $this->bootLoaders(); $this->bootDirectives(); - $this->bootResourceModels(); + $this->bootResources(); $this->bootCommands(); $this->bootPublishing(); } @@ -82,7 +82,7 @@ class FilamentServiceProvider extends ServiceProvider $this->app->bind('Filament\User', $models['user']); } - protected function bootResources(): void + protected function bootLoaders(): void { $this->loadViewsFrom(__DIR__.'/../resources/views', 'filament'); $this->loadViewComponentsAs(config('filament.prefix.component', 'filament'), config('filament.components', [])); @@ -119,25 +119,23 @@ class FilamentServiceProvider extends ServiceProvider ], 'filament-assets'); } - protected function bootResourceModels(): void + protected function bootResources(): void { - if (Features::hasResourceModels()) { + if (Features::hasResources()) { $this->app->booted(function () { - $models = $this->app->filament->getResourceModels(); - - $models->each(function ($item, $key) { - $model = $this->app->make($item); + $this->app->filament->resources()->each(function ($item, $key) { + $resource = $this->app->make($item); - if (array_key_exists('index', $model->actions())) { - $route = route('filament.resource', ['model' => $key]); + if (array_key_exists('index', $resource->actions())) { + $route = route('filament.resource', ['resource' => $key]); app(Navigation::class)->$key = [ 'path' => $route, 'active' => $route.'*', - 'label' => $model->label ?? Str::plural($key), - 'icon' => $model->icon ?? 'heroicon-o-database', - 'sort' => $model->sort ?? 0, - 'hideFromNav' => $model->hideFromNav ?? false, + 'label' => $resource->label ?? Str::plural($key), + 'icon' => $resource->icon, + 'sort' => $resource->sort, + 'hideFromNav' => $resource->hideFromNav, ]; } }); diff --git a/src/Http/Controllers/ResourceModelController.php b/src/Http/Controllers/ResourceController.php similarity index 50% rename from src/Http/Controllers/ResourceModelController.php rename to src/Http/Controllers/ResourceController.php index 5cd9eb934c..d77e17362c 100644 --- a/src/Http/Controllers/ResourceModelController.php +++ b/src/Http/Controllers/ResourceController.php @@ -7,15 +7,15 @@ use Illuminate\Routing\Route; use Illuminate\View\View; use Filament; -class ResourceModelController extends Controller +class ResourceController extends Controller { - public function __invoke(Container $container, Route $route, string $model, string $action = 'index'): View + public function __invoke(Container $container, Route $route, string $resource, string $action = 'index'): View { - $model = Filament::getResourceModels()->get($model); - abort_unless($model, 404); + $resourceClass = Filament::resources()->get($resource); + abort_unless($resourceClass, 400, __("`$resource` is not a valid resource.")); - $component = collect(app($model)->actions())->get($action); - abort_unless($component, 400, __("`$action` is not a valid resource action in `$model`")); + $component = collect(app($resourceClass)->actions())->get($action); + abort_unless($component, 400, __("`$action` is not a valid resource action in `$resourceClass`.")); return call_user_func((new $component), $container, $route); } diff --git a/src/Traits/FilamentResource.php b/src/Traits/FilamentResource.php deleted file mode 100644 index 4bcb0639fd..0000000000 --- a/src/Traits/FilamentResource.php +++ /dev/null @@ -1,11 +0,0 @@ - '', ]); - $app['config']->set('filament.paths.models', __DIR__.'/Database/Models'); + $app['config']->set('filament.resources', __DIR__.'/Resources'); $app['config']->set('auth.providers.users.model', User::class); $app['config']->set('filament.models.user', User::class); }