From 4fbb3676fdffb3bd23d0442cffe0df5e7051a8c9 Mon Sep 17 00:00:00 2001 From: Ryan Scherler Date: Wed, 4 Nov 2020 13:32:30 -0800 Subject: [PATCH] More Resouce models scaffolding --- config/filament.php | 2 +- routes/web.php | 75 +++++++++---------- src/Contracts/FilamentResource.php | 7 ++ src/Filament.php | 4 +- src/FilamentServiceProvider.php | 42 ++++++----- src/Http/Controllers/Controller.php | 13 ++++ .../Controllers/ResourceModelController.php | 17 +++++ src/Providers/RouteServiceProvider.php | 47 ++++++++++++ src/Traits/FilamentResource.php | 7 -- 9 files changed, 143 insertions(+), 71 deletions(-) create mode 100644 src/Contracts/FilamentResource.php create mode 100644 src/Http/Controllers/Controller.php create mode 100644 src/Http/Controllers/ResourceModelController.php create mode 100644 src/Providers/RouteServiceProvider.php delete mode 100644 src/Traits/FilamentResource.php diff --git a/config/filament.php b/config/filament.php index a9a15eee5f..2029c6391c 100644 --- a/config/filament.php +++ b/config/filament.php @@ -29,7 +29,7 @@ return [ 'features' => [ Features::registration(), - // Features::resourceModels() + Features::resourceModels() ], 'models' => [ diff --git a/routes/web.php b/routes/web.php index 24e2442323..55f94d6de3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -4,48 +4,41 @@ use Illuminate\Support\Facades\Route; use Filament\Features; use Filament\Http\Controllers\{ AssetController, + ResourceModelController, }; -Route::group([ - 'prefix' => config('filament.prefix.route'), - 'middleware' => config('filament.middleware', ['web']), - 'as' => 'filament.', -], function () { - // Assets - Route::name('assets.')->group(function () { - Route::get('filament.css', [AssetController::class, 'css'])->name('css'); - Route::get('filament.css.map', [AssetController::class, 'cssMap']); - Route::get('filament.js', [AssetController::class, 'js'])->name('js'); - Route::get('filament.js.map', [AssetController::class, 'jsMap']); - }); - - // Auth - Route::prefix('auth')->group(function () { - Route::get('login', config('filament.livewire.login'))->name('login'); - Route::get('forgot-password', config('filament.livewire.forgot-password'))->name('password.forgot'); - Route::get('reset-password/{token}', config('filament.livewire.reset-password'))->name('password.reset'); - }); - - // Registration - if (Features::registersUsers()) { - Route::get('/register', config('filament.livewire.register'))->name('register'); - } - - // Authenticated routes - Route::group(['middleware' => ['auth']], function () { - // Dashboard - Route::get('/', config('filament.livewire.dashboard'))->name('dashboard'); - - // Profile - // Route::get('profile', config('filament.livewire.profile')) - // ->middleware('verified') - // ->name('profile'); - }); +// Assets +Route::name('assets.')->group(function () { + Route::get('filament.css', [AssetController::class, 'css'])->name('css'); + Route::get('filament.css.map', [AssetController::class, 'cssMap']); + Route::get('filament.js', [AssetController::class, 'js'])->name('js'); + Route::get('filament.js.map', [AssetController::class, 'jsMap']); }); -// Conditional route login alias -if (!Route::has('login')) { - Route::get('/login', function () { - return redirect()->route("filament.login"); - })->name('login'); -} \ No newline at end of file +// Auth +Route::prefix('auth')->group(function () { + Route::get('login', config('filament.livewire.login'))->name('login'); + Route::get('forgot-password', config('filament.livewire.forgot-password'))->name('password.forgot'); + Route::get('reset-password/{token}', config('filament.livewire.reset-password'))->name('password.reset'); +}); + +// Registration +if (Features::registersUsers()) { + Route::get('/register', config('filament.livewire.register'))->name('register'); +} + +// Authenticated routes +Route::group(['middleware' => ['auth']], function () { + // Dashboard + Route::get('/', config('filament.livewire.dashboard'))->name('dashboard'); + + // Profile + // Route::get('profile', config('filament.livewire.profile')) + // ->middleware('verified') + // ->name('profile'); + + // Resource Models + if (Features::hasResourceModels()) { + Route::get('/resources/{model}/{action?}', ResourceModelController::class)->name('resource'); + } +}); \ No newline at end of file diff --git a/src/Contracts/FilamentResource.php b/src/Contracts/FilamentResource.php new file mode 100644 index 0000000000..1b6b83c3f9 --- /dev/null +++ b/src/Contracts/FilamentResource.php @@ -0,0 +1,7 @@ +isSubclassOf(Model::class) && - in_array(FilamentResource::class, class_uses_recursive($class)) && + in_array(FilamentResource::class, class_implements($class)) && !$reflection->isAbstract(); }); diff --git a/src/FilamentServiceProvider.php b/src/FilamentServiceProvider.php index 8fd56af1c1..7026fea011 100644 --- a/src/FilamentServiceProvider.php +++ b/src/FilamentServiceProvider.php @@ -17,6 +17,7 @@ use Filament\BladeDirectives; use Filament\Commands\{ MakeUser, }; +use Filament\Providers\RouteServiceProvider; use Filament\Features; use Filament\Models\Navigation; @@ -27,6 +28,7 @@ class FilamentServiceProvider extends ServiceProvider $this->mergeConfigFrom(__DIR__.'/../config/filament.php', 'filament'); $this->registerSingletons(); $this->registerLivewireComponents(); + $this->registerProviders(); } public function boot(): void @@ -35,7 +37,6 @@ class FilamentServiceProvider extends ServiceProvider $this->bootPolicies(); $this->bootResources(); $this->bootDirectives(); - $this->bootRoutes(); $this->bootResourceModels(); $this->bootCommands(); $this->bootPublishing(); @@ -60,6 +61,11 @@ class FilamentServiceProvider extends ServiceProvider }); } + protected function registerProviders(): void + { + $this->app->register(RouteServiceProvider::class); + } + protected function bootModelBindings(): void { $models = $this->app->config['filament.models']; @@ -116,29 +122,25 @@ class FilamentServiceProvider extends ServiceProvider ], 'filament-assets'); } - protected function bootRoutes(): void - { - if (Filament::$registersRoutes) { - $this->loadRoutesFrom(__DIR__.'/../routes/web.php'); - } - } - protected function bootResourceModels(): void { if (Features::hasResourceModels()) { - $models = $this->app->filament->getResourceModels(app_path()); - - $models->each(function ($model) { - $reflection = new \ReflectionClass($model); - $staticProperties = collect($reflection->getStaticProperties()); - $model = $reflection->getShortName(); + $this->app->booted(function () { + $models = $this->app->filament->getResourceModels(app_path()); - Navigation::create([ - 'path' => $staticProperties->get('path', route('filament.resource', ['model' => $model])), - 'active' => $staticProperties->get('active', []), - 'label' => $staticProperties->get('label', Str::plural($model)), - 'icon' => $staticProperties->get('icon', 'heroicon-o-document-text'), - ]); + $models->each(function ($class) { + $model = $this->app->make($class); + $actions = $model->actions() ?? []; + + if (array_key_exists('index', $actions)) { + Navigation::create([ + 'path' => route('filament.resource', ['model' => class_basename($model)]), + 'active' => $model->active ?? [], + 'label' => $model->label ?? Str::plural(class_basename($model)), + 'icon' => $model->icon ?? 'heroicon-o-database', + ]); + } + }); }); } } diff --git a/src/Http/Controllers/Controller.php b/src/Http/Controllers/Controller.php new file mode 100644 index 0000000000..4a2003e400 --- /dev/null +++ b/src/Http/Controllers/Controller.php @@ -0,0 +1,13 @@ +mapWebRoutes(); + $this->mapAliasRoutes(); + } + + protected function mapWebRoutes(): void + { + if (Filament::$registersRoutes) { + Route::prefix($this->prefix()) + ->middleware(config('filament.middleware', ['web'])) + ->name($this->name) + ->group(__DIR__.'/../../routes/web.php'); + } + } + + protected function mapAliasRoutes(): void + { + if (!Route::has('login')) { + Route::get('/login', function () { + return redirect()->route('filament.login'); + })->name('login'); + } + } +} \ No newline at end of file diff --git a/src/Traits/FilamentResource.php b/src/Traits/FilamentResource.php deleted file mode 100644 index 9d600a4d6a..0000000000 --- a/src/Traits/FilamentResource.php +++ /dev/null @@ -1,7 +0,0 @@ -