diff --git a/packages/support/src/Components/ComponentManager.php b/packages/support/src/Components/ComponentManager.php index 932161f3d0..b3d147ddba 100644 --- a/packages/support/src/Components/ComponentManager.php +++ b/packages/support/src/Components/ComponentManager.php @@ -3,10 +3,11 @@ namespace Filament\Support\Components; use Closure; +use Filament\Support\Components\Contracts\ScopedComponentManager; use ReflectionClass; use ReflectionMethod; -class ComponentManager +class ComponentManager implements ScopedComponentManager { /** * @var array> @@ -27,24 +28,23 @@ class ComponentManager { } - public static function isResolved(): bool + public static function resolve(): ScopedComponentManager { - return app()->resolved(static::class); + if (app()->resolved(ScopedComponentManager::class)) { + return static::resolveScoped(); + } + + return app(ComponentManager::class); } - public static function register(): void + public static function resolveScoped(): ScopedComponentManager { - app()->scopedIf( - static::class, - fn () => new static(), - ); + return app(ScopedComponentManager::class); } - public static function resolve(): static + public function clone(): static { - static::register(); - - return app(static::class); + return clone $this; } public function configureUsing(string $component, Closure $modifyUsing, ?Closure $during = null, bool $isImportant = false): mixed diff --git a/packages/support/src/Components/Contracts/ScopedComponentManager.php b/packages/support/src/Components/Contracts/ScopedComponentManager.php new file mode 100644 index 0000000000..9504eaf6e1 --- /dev/null +++ b/packages/support/src/Components/Contracts/ScopedComponentManager.php @@ -0,0 +1,18 @@ + + */ + public function extractPublicMethods(Component $component): array; +} diff --git a/packages/support/src/Concerns/Configurable.php b/packages/support/src/Concerns/Configurable.php index f979ce79f1..37b77d283c 100644 --- a/packages/support/src/Concerns/Configurable.php +++ b/packages/support/src/Concerns/Configurable.php @@ -9,20 +9,6 @@ trait Configurable { public static function configureUsing(Closure $modifyUsing, ?Closure $during = null, bool $isImportant = false): mixed { - if (! ($during || ComponentManager::isResolved())) { - app()->resolving( - ComponentManager::class, - fn (ComponentManager $manager) => $manager->configureUsing( - static::class, - $modifyUsing, - $during, - $isImportant, - ), - ); - - return null; - } - return ComponentManager::resolve()->configureUsing( static::class, $modifyUsing, diff --git a/packages/support/src/SupportServiceProvider.php b/packages/support/src/SupportServiceProvider.php index 4678b607f1..6c95fd00ea 100644 --- a/packages/support/src/SupportServiceProvider.php +++ b/packages/support/src/SupportServiceProvider.php @@ -12,13 +12,16 @@ use Filament\Support\Commands\CheckTranslationsCommand; use Filament\Support\Commands\InstallCommand; use Filament\Support\Commands\UpgradeCommand; use Filament\Support\Components\ComponentManager; +use Filament\Support\Components\Contracts\ScopedComponentManager; use Filament\Support\Facades\FilamentAsset; use Filament\Support\Icons\IconManager; use Filament\Support\View\ViewManager; use Illuminate\Foundation\Console\AboutCommand; use Illuminate\Support\Facades\Blade; +use Illuminate\Support\Facades\Event; use Illuminate\Support\Str; use Illuminate\Support\Stringable; +use Laravel\Octane\Events\RequestReceived; use Spatie\LaravelPackageTools\Package; use Spatie\LaravelPackageTools\PackageServiceProvider; use Symfony\Component\HtmlSanitizer\HtmlSanitizer; @@ -49,7 +52,17 @@ class SupportServiceProvider extends PackageServiceProvider fn () => new AssetManager(), ); - ComponentManager::register(); + $this->app->singleton( + ComponentManager::class, + fn () => new ComponentManager(), + ); + + $this->app->scoped( + ScopedComponentManager::class, + fn () => $this->app->make(ComponentManager::class)->clone(), + ); + $this->app->booted(fn () => ComponentManager::resolveScoped()); + class_exists(RequestReceived::class) && Event::listen(RequestReceived::class, fn () => ComponentManager::resolveScoped()); $this->app->scoped( ColorManager::class,