diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 02c8c00e6..11c8018c8 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,11 +2,8 @@ namespace BookStack\Console; -use BookStack\Facades\Theme; -use BookStack\Theming\ThemeService; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; -use Symfony\Component\Console\Command\Command; class Kernel extends ConsoleKernel { @@ -38,13 +35,6 @@ class Kernel extends ConsoleKernel */ protected function commands() { - // Default framework command loading from 'Commands' directory $this->load(__DIR__ . '/Commands'); - - // Load any user commands that have been registered via the theme system. - $themeService = $this->app->make(ThemeService::class); - foreach ($themeService->getRegisteredCommands() as $command) { - $this->registerCommand($command); - } } } diff --git a/app/Theming/ThemeService.php b/app/Theming/ThemeService.php index f095c7a8e..f0f8f033c 100644 --- a/app/Theming/ThemeService.php +++ b/app/Theming/ThemeService.php @@ -3,17 +3,13 @@ namespace BookStack\Theming; use BookStack\Auth\Access\SocialAuthService; +use Illuminate\Contracts\Console\Kernel; use Symfony\Component\Console\Command\Command; class ThemeService { protected $listeners = []; - /** - * @var Command[] - */ - protected $commands = []; - /** * Listen to a given custom theme event, * setting up the action to be ran when the event occurs. @@ -54,15 +50,9 @@ class ThemeService */ public function registerCommand(Command $command) { - $this->commands[] = $command; - } - - /** - * Get the custom commands that have been registered. - */ - public function getRegisteredCommands(): array - { - return $this->commands; + /** @var \Illuminate\Foundation\Console\Kernel $consoleKernel */ + $consoleKernel = app()->make(Kernel::class); + $consoleKernel->registerCommand($command); } /** diff --git a/tests/ThemeTest.php b/tests/ThemeTest.php index 9aa7873b0..f04250bff 100644 --- a/tests/ThemeTest.php +++ b/tests/ThemeTest.php @@ -7,8 +7,10 @@ use BookStack\Entities\Models\Page; use BookStack\Entities\Tools\PageContent; use BookStack\Facades\Theme; use BookStack\Theming\ThemeEvents; +use Illuminate\Console\Command; use Illuminate\Http\Request; use Illuminate\Http\Response; +use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\File; use League\CommonMark\ConfigurableEnvironmentInterface; @@ -206,6 +208,16 @@ class ThemeTest extends TestCase $this->assertStringContainsString('donkey=donut', $redirect); } + public function test_register_command_allows_provided_command_to_be_usable_via_artisan() + { + Theme::registerCommand(new MyCustomCommand); + + Artisan::call('bookstack:test-custom-command', []); + $output = Artisan::output(); + + $this->assertStringContainsString('Command ran!', $output); + } + protected function usingThemeFolder(callable $callback) { // Create a folder and configure a theme @@ -220,3 +232,10 @@ class ThemeTest extends TestCase File::deleteDirectory($themeFolderPath); } } + +class MyCustomCommand extends Command { + protected $signature = 'bookstack:test-custom-command'; + public function handle() { + $this->line('Command ran!'); + } +} \ No newline at end of file