mirror of
https://github.com/filamentphp/filament.git
synced 2026-09-24 15:42:09 +08:00
More Resouce models scaffolding
This commit is contained in:
+1
-1
@@ -29,7 +29,7 @@ return [
|
||||
|
||||
'features' => [
|
||||
Features::registration(),
|
||||
// Features::resourceModels()
|
||||
Features::resourceModels()
|
||||
],
|
||||
|
||||
'models' => [
|
||||
|
||||
+34
-41
@@ -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');
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace Filament\Contracts;
|
||||
|
||||
interface FilamentResource {
|
||||
public function actions(): array;
|
||||
}
|
||||
+2
-2
@@ -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();
|
||||
});
|
||||
|
||||
|
||||
@@ -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',
|
||||
]);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Filament\Traits;
|
||||
|
||||
trait FilamentResource {
|
||||
//...
|
||||
}
|
||||
Reference in New Issue
Block a user