More Resouce models scaffolding

This commit is contained in:
Ryan Scherler
2020-11-04 13:32:30 -08:00
parent 43644fc628
commit 4fbb3676fd
9 changed files with 143 additions and 71 deletions
+1 -1
View File
@@ -29,7 +29,7 @@ return [
'features' => [
Features::registration(),
// Features::resourceModels()
Features::resourceModels()
],
'models' => [
+34 -41
View File
@@ -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');
}
// 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');
}
});
+7
View File
@@ -0,0 +1,7 @@
<?php
namespace Filament\Contracts;
interface FilamentResource {
public function actions(): array;
}
+2 -2
View File
@@ -12,7 +12,7 @@ use Illuminate\Support\{
Collection,
HtmlString,
};
use Filament\Traits\FilamentResource;
use Filament\Contracts\FilamentResource;
class Filament
{
@@ -160,7 +160,7 @@ class Filament
$reflection = new \ReflectionClass($class);
return $reflection->isSubclassOf(Model::class) &&
in_array(FilamentResource::class, class_uses_recursive($class)) &&
in_array(FilamentResource::class, class_implements($class)) &&
!$reflection->isAbstract();
});
+22 -20
View File
@@ -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',
]);
}
});
});
}
}
+13
View File
@@ -0,0 +1,13 @@
<?php
namespace Filament\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
@@ -0,0 +1,17 @@
<?php
namespace Filament\Http\Controllers;
class ResourceModelController extends Controller
{
/**
* Show the resource for the given model.
*
* @param int $id
* @return \Illuminate\View\View
*/
public function __invoke(string $model, string $action = 'index')
{
return 'Model: '.$model.' action: '.$action;
}
}
+47
View File
@@ -0,0 +1,47 @@
<?php
namespace Filament\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Filament\Filament;
class RouteServiceProvider extends ServiceProvider
{
protected $name = 'filament.';
public function boot(): void
{
parent::boot();
}
protected function prefix()
{
return config('filament.prefix.route');
}
public function map(): void
{
$this->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');
}
}
}
-7
View File
@@ -1,7 +0,0 @@
<?php
namespace Filament\Traits;
trait FilamentResource {
//...
}