diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 11c8018c8..02c8c00e6 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,8 +2,11 @@ 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 { @@ -35,6 +38,13 @@ 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 602abaf1c..f095c7a8e 100644 --- a/app/Theming/ThemeService.php +++ b/app/Theming/ThemeService.php @@ -3,11 +3,17 @@ namespace BookStack\Theming; use BookStack\Auth\Access\SocialAuthService; +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. @@ -43,6 +49,22 @@ class ThemeService return null; } + /** + * Register a new custom artisan command to be available. + */ + public function registerCommand(Command $command) + { + $this->commands[] = $command; + } + + /** + * Get the custom commands that have been registered. + */ + public function getRegisteredCommands(): array + { + return $this->commands; + } + /** * Read any actions from the set theme path if the 'functions.php' file exists. */ diff --git a/dev/docs/logical-theme-system.md b/dev/docs/logical-theme-system.md index b950d7df9..4d6ed719b 100644 --- a/dev/docs/logical-theme-system.md +++ b/dev/docs/logical-theme-system.md @@ -77,6 +77,32 @@ Theme::listen(ThemeEvents::APP_BOOT, function($app) { }); ``` +## Custom Commands + +The logical theme system supports adding custom [artisan commands](https://laravel.com/docs/8.x/artisan) to BookStack. These can be registered in your `functions.php` file by calling `Theme::registerCommand($command)`, where `$command` is an instance of `\Symfony\Component\Console\Command\Command`. + +Below is an example of registering a command that could then be ran using `php artisan bookstack:meow` on the command line. + +```php +line('Meow there!'); + } +} + +Theme::registerCommand(new MeowCommand); +``` + ## Custom Socialite Service Example The below shows an example of adding a custom reddit socialite service to BookStack.