From c01e3e05887c4faada919dabe12edfdbac96abcc Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Fri, 5 Jan 2024 22:13:47 +0000 Subject: [PATCH 1/9] Autoload addon tags, widgets, modifiers etc from folder --- src/Providers/AddonServiceProvider.php | 57 +++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/src/Providers/AddonServiceProvider.php b/src/Providers/AddonServiceProvider.php index a344f4e104..2f9216ce36 100644 --- a/src/Providers/AddonServiceProvider.php +++ b/src/Providers/AddonServiceProvider.php @@ -226,7 +226,11 @@ public function bootEvents() protected function bootTags() { - foreach ($this->tags as $class) { + $tags = collect($this->tags) + ->merge($this->autoloadFilesFromFolder('Tags', Tags::class)) + ->unique(); + + foreach ($tags as $class) { $class::register(); } @@ -235,7 +239,11 @@ protected function bootTags() protected function bootScopes() { - foreach ($this->scopes as $class) { + $scopes = collect($this->scopes) + ->merge($this->autoloadFilesFromFolder('Scopes', Scope::class)) + ->unique(); + + foreach ($scopes as $class) { $class::register(); } @@ -244,7 +252,11 @@ protected function bootScopes() protected function bootActions() { - foreach ($this->actions as $class) { + $actions = collect($this->actions) + ->merge($this->autoloadFilesFromFolder('Actions', Action::class)) + ->unique(); + + foreach ($actions as $class) { $class::register(); } @@ -253,7 +265,11 @@ protected function bootActions() protected function bootFieldtypes() { - foreach ($this->fieldtypes as $class) { + $fieldtypes = collect($this->fieldtypes) + ->merge($this->autoloadFilesFromFolder('Fieldtypes', Fieldtype::class)) + ->unique(); + + foreach ($fieldtypes as $class) { $class::register(); } @@ -262,7 +278,11 @@ protected function bootFieldtypes() protected function bootModifiers() { - foreach ($this->modifiers as $class) { + $modifiers = collect($this->modifiers) + ->merge($this->autoloadFilesFromFolder('Modifiers', Modifier::class)) + ->unique(); + + foreach ($modifiers as $class) { $class::register(); } @@ -271,7 +291,11 @@ protected function bootModifiers() protected function bootWidgets() { - foreach ($this->widgets as $class) { + $widgets = collect($this->widgets) + ->merge($this->autoloadFilesFromFolder('Widgets', Widget::class)) + ->unique(); + + foreach ($widgets as $class) { $class::register(); } @@ -630,4 +654,25 @@ protected function bootFieldsets() return $this; } + + protected function autoloadFilesFromFolder($folder, $requiredClass) + { + $path = $this->getAddon()->directory().'src/'.$folder; + + if (! $this->app['files']->exists($path)) { + return []; + } + + $autoloadable = []; + + foreach ($this->app['files']->files($path) as $file) { + $class = $file->getBasename('.php'); + $fqcn = $this->namespace()."\\{$folder}\\{$class}"; + if (is_subclass_of($fqcn, $requiredClass)) { + $autoloadable[] = $fqcn; + } + } + + return $autoloadable; + } } From 49d1d4db75763343b519dd4189058c90e0028b06 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Fri, 5 Jan 2024 22:21:45 +0000 Subject: [PATCH 2/9] Commands too --- src/Providers/AddonServiceProvider.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Providers/AddonServiceProvider.php b/src/Providers/AddonServiceProvider.php index 2f9216ce36..cbbbaa4963 100644 --- a/src/Providers/AddonServiceProvider.php +++ b/src/Providers/AddonServiceProvider.php @@ -322,8 +322,13 @@ protected function bootPolicies() protected function bootCommands() { + $commands = collect($this->commands) + ->merge($this->autoloadFilesFromFolder('Commands', Command::class)) + ->unique() + ->all(); + if ($this->app->runningInConsole()) { - $this->commands($this->commands); + $this->commands($commands); } return $this; From 51668c9cef9d20884b032a169fc9fa776debf566 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Fri, 5 Jan 2024 22:40:13 +0000 Subject: [PATCH 3/9] Use autoload() instead of hardcoding src --- src/Providers/AddonServiceProvider.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Providers/AddonServiceProvider.php b/src/Providers/AddonServiceProvider.php index cbbbaa4963..90642f360b 100644 --- a/src/Providers/AddonServiceProvider.php +++ b/src/Providers/AddonServiceProvider.php @@ -662,7 +662,8 @@ protected function bootFieldsets() protected function autoloadFilesFromFolder($folder, $requiredClass) { - $path = $this->getAddon()->directory().'src/'.$folder; + $addon = $this->getAddon(); + $path = $addon->directory().$addon->autoload().'/'.$folder; if (! $this->app['files']->exists($path)) { return []; From 2fd20e1ac8164dd15149eb51fb73bc9e9eb5e8c8 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Mon, 15 Jan 2024 11:55:11 +0000 Subject: [PATCH 4/9] Search Console/Commands and UpdateScripts --- src/Providers/AddonServiceProvider.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Providers/AddonServiceProvider.php b/src/Providers/AddonServiceProvider.php index 90642f360b..baaa1eaada 100644 --- a/src/Providers/AddonServiceProvider.php +++ b/src/Providers/AddonServiceProvider.php @@ -324,6 +324,7 @@ protected function bootCommands() { $commands = collect($this->commands) ->merge($this->autoloadFilesFromFolder('Commands', Command::class)) + ->merge($this->autoloadFilesFromFolder('Console/Commands', Command::class)) ->unique() ->all(); @@ -513,7 +514,11 @@ protected function bootMiddleware() protected function bootUpdateScripts() { - foreach ($this->updateScripts as $class) { + $scripts = collect($this->updateScripts) + ->merge($this->autoloadFilesFromFolder('UpdateScripts', UpdateScript::class)) + ->unique(); + + foreach ($scripts as $class) { $class::register($this->getAddon()->package()); } From d44cfba81890d73e20cf7da05aa5188ac3cd62d3 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Thu, 18 Jan 2024 10:23:31 +0000 Subject: [PATCH 5/9] Fix incorrect fully qualified class name Commands in src/Console/Commands weren't being picked up due to the incorrect FQCN being constructed here. --- src/Providers/AddonServiceProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Providers/AddonServiceProvider.php b/src/Providers/AddonServiceProvider.php index baaa1eaada..21b163d681 100644 --- a/src/Providers/AddonServiceProvider.php +++ b/src/Providers/AddonServiceProvider.php @@ -678,7 +678,7 @@ protected function autoloadFilesFromFolder($folder, $requiredClass) foreach ($this->app['files']->files($path) as $file) { $class = $file->getBasename('.php'); - $fqcn = $this->namespace()."\\{$folder}\\{$class}"; + $fqcn = $this->namespace() . '\\' . str_replace('/', '\\', $folder) . '\\' . $class; if (is_subclass_of($fqcn, $requiredClass)) { $autoloadable[] = $fqcn; } From 4b5a42b39ff17720363c6fb3a83cf8cb93203cba Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Thu, 18 Jan 2024 10:28:09 +0000 Subject: [PATCH 6/9] Pint --- src/Providers/AddonServiceProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Providers/AddonServiceProvider.php b/src/Providers/AddonServiceProvider.php index 21b163d681..bdf43b14a7 100644 --- a/src/Providers/AddonServiceProvider.php +++ b/src/Providers/AddonServiceProvider.php @@ -678,7 +678,7 @@ protected function autoloadFilesFromFolder($folder, $requiredClass) foreach ($this->app['files']->files($path) as $file) { $class = $file->getBasename('.php'); - $fqcn = $this->namespace() . '\\' . str_replace('/', '\\', $folder) . '\\' . $class; + $fqcn = $this->namespace().'\\'.str_replace('/', '\\', $folder).'\\'.$class; if (is_subclass_of($fqcn, $requiredClass)) { $autoloadable[] = $fqcn; } From 0114c4cf4e73983e65acdc8376e8e3a29394d100 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Sat, 20 Jan 2024 14:26:14 +0000 Subject: [PATCH 7/9] poc of caching --- src/Extend/Addon.php | 19 +++++++++++++++++++ src/Extend/Manifest.php | 26 ++++++++++++++++++++++++++ src/Providers/AddonServiceProvider.php | 5 +++++ 3 files changed, 50 insertions(+) diff --git a/src/Extend/Addon.php b/src/Extend/Addon.php index 3f798eb5bf..5bf60f30e8 100644 --- a/src/Extend/Addon.php +++ b/src/Extend/Addon.php @@ -147,6 +147,13 @@ final class Addon */ protected $editions = []; + /** + * Cache of folders. + * + * @var array|null + */ + protected $folderCache = []; + /** * @param string $id */ @@ -177,6 +184,7 @@ public static function makeFromPackage(array $package) $keys = [ 'id', 'slug', 'editions', 'marketplaceId', 'marketplaceSlug', 'marketplaceUrl', 'marketplaceSellerSlug', 'name', 'namespace', 'autoload', 'provider', 'description', 'package', 'version', 'latestVersion', 'url', 'developer', 'developerUrl', 'isCommercial', + 'folderCache', ]; foreach (Arr::only($package, $keys) as $key => $value) { @@ -459,4 +467,15 @@ public function editions($editions = null) return $this; } + + public function folderCache($folderCache = null) + { + if (func_num_args() === 0) { + return collect($this->folderCache); + } + + $this->folderCache = $folderCache; + + return $this; + } } diff --git a/src/Extend/Manifest.php b/src/Extend/Manifest.php index b038b02637..7e9470ec25 100644 --- a/src/Extend/Manifest.php +++ b/src/Extend/Manifest.php @@ -64,6 +64,11 @@ protected function formatPackage($package) 'autoload' => $autoload, 'provider' => $provider, + // autoload from folders + 'folderCache' => [ + 'tags' => $this->autoloadFilesFromFolder($directory, $autoload, $namespace, 'Tags', \Statamic\Tags\Tags::class), + ], + // Local data for marketplace GUI? 'name' => $statamic['name'] ?? Arr::last($providerParts), 'url' => $statamic['url'] ?? null, @@ -78,4 +83,25 @@ public function addons() { return collect($this->getManifest()); } + + protected function autoloadFilesFromFolder($directory, $autoload, $namespace, $folder, $requiredClass) + { + $path = $directory.$autoload.'/'.$folder; + + if (! app()['files']->exists($path)) { + return []; + } + + $autoloadable = []; + + foreach (app()['files']->files($path) as $file) { + $class = $file->getBasename('.php'); + $fqcn = $namespace.'\\'.str_replace('/', '\\', $folder).'\\'.$class; + if (is_subclass_of($fqcn, $requiredClass)) { + $autoloadable[] = $fqcn; + } + } + + return $autoloadable; + } } diff --git a/src/Providers/AddonServiceProvider.php b/src/Providers/AddonServiceProvider.php index bdf43b14a7..571649d03a 100644 --- a/src/Providers/AddonServiceProvider.php +++ b/src/Providers/AddonServiceProvider.php @@ -668,6 +668,11 @@ protected function bootFieldsets() protected function autoloadFilesFromFolder($folder, $requiredClass) { $addon = $this->getAddon(); + + if ($cache = $addon->folderCache()->get(Str::lower($folder))) { + return $cache; + } + $path = $addon->directory().$addon->autoload().'/'.$folder; if (! $this->app['files']->exists($path)) { From 4565bde8bcf34d68bc3b720b26b97e70027aa9d6 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Fri, 10 May 2024 11:42:37 +0100 Subject: [PATCH 8/9] Revert "poc of caching" This reverts commit 0114c4cf4e73983e65acdc8376e8e3a29394d100. --- src/Extend/Addon.php | 19 ------------------- src/Extend/Manifest.php | 26 -------------------------- src/Providers/AddonServiceProvider.php | 5 ----- 3 files changed, 50 deletions(-) diff --git a/src/Extend/Addon.php b/src/Extend/Addon.php index 5bf60f30e8..3f798eb5bf 100644 --- a/src/Extend/Addon.php +++ b/src/Extend/Addon.php @@ -147,13 +147,6 @@ final class Addon */ protected $editions = []; - /** - * Cache of folders. - * - * @var array|null - */ - protected $folderCache = []; - /** * @param string $id */ @@ -184,7 +177,6 @@ public static function makeFromPackage(array $package) $keys = [ 'id', 'slug', 'editions', 'marketplaceId', 'marketplaceSlug', 'marketplaceUrl', 'marketplaceSellerSlug', 'name', 'namespace', 'autoload', 'provider', 'description', 'package', 'version', 'latestVersion', 'url', 'developer', 'developerUrl', 'isCommercial', - 'folderCache', ]; foreach (Arr::only($package, $keys) as $key => $value) { @@ -467,15 +459,4 @@ public function editions($editions = null) return $this; } - - public function folderCache($folderCache = null) - { - if (func_num_args() === 0) { - return collect($this->folderCache); - } - - $this->folderCache = $folderCache; - - return $this; - } } diff --git a/src/Extend/Manifest.php b/src/Extend/Manifest.php index 7e9470ec25..b038b02637 100644 --- a/src/Extend/Manifest.php +++ b/src/Extend/Manifest.php @@ -64,11 +64,6 @@ protected function formatPackage($package) 'autoload' => $autoload, 'provider' => $provider, - // autoload from folders - 'folderCache' => [ - 'tags' => $this->autoloadFilesFromFolder($directory, $autoload, $namespace, 'Tags', \Statamic\Tags\Tags::class), - ], - // Local data for marketplace GUI? 'name' => $statamic['name'] ?? Arr::last($providerParts), 'url' => $statamic['url'] ?? null, @@ -83,25 +78,4 @@ public function addons() { return collect($this->getManifest()); } - - protected function autoloadFilesFromFolder($directory, $autoload, $namespace, $folder, $requiredClass) - { - $path = $directory.$autoload.'/'.$folder; - - if (! app()['files']->exists($path)) { - return []; - } - - $autoloadable = []; - - foreach (app()['files']->files($path) as $file) { - $class = $file->getBasename('.php'); - $fqcn = $namespace.'\\'.str_replace('/', '\\', $folder).'\\'.$class; - if (is_subclass_of($fqcn, $requiredClass)) { - $autoloadable[] = $fqcn; - } - } - - return $autoloadable; - } } diff --git a/src/Providers/AddonServiceProvider.php b/src/Providers/AddonServiceProvider.php index 571649d03a..bdf43b14a7 100644 --- a/src/Providers/AddonServiceProvider.php +++ b/src/Providers/AddonServiceProvider.php @@ -668,11 +668,6 @@ protected function bootFieldsets() protected function autoloadFilesFromFolder($folder, $requiredClass) { $addon = $this->getAddon(); - - if ($cache = $addon->folderCache()->get(Str::lower($folder))) { - return $cache; - } - $path = $addon->directory().$addon->autoload().'/'.$folder; if (! $this->app['files']->exists($path)) { From 5e9ad2eea6b21ff7178b0014f4902f68414bfb2e Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Fri, 27 Sep 2024 14:17:28 -0400 Subject: [PATCH 9/9] wrap in condition --- src/Providers/AddonServiceProvider.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Providers/AddonServiceProvider.php b/src/Providers/AddonServiceProvider.php index 0955b1e9a4..f1a78c7717 100644 --- a/src/Providers/AddonServiceProvider.php +++ b/src/Providers/AddonServiceProvider.php @@ -345,13 +345,13 @@ protected function bootPolicies() protected function bootCommands() { - $commands = collect($this->commands) - ->merge($this->autoloadFilesFromFolder('Commands', Command::class)) - ->merge($this->autoloadFilesFromFolder('Console/Commands', Command::class)) - ->unique() - ->all(); - if ($this->app->runningInConsole()) { + $commands = collect($this->commands) + ->merge($this->autoloadFilesFromFolder('Commands', Command::class)) + ->merge($this->autoloadFilesFromFolder('Console/Commands', Command::class)) + ->unique() + ->all(); + $this->commands($commands); }