]> BookStack Code Mirror - bookstack/commitdiff
Support custom commands via logical theme system
authorDan Brown <redacted>
Mon, 22 Nov 2021 18:30:58 +0000 (18:30 +0000)
committerDan Brown <redacted>
Mon, 22 Nov 2021 18:30:58 +0000 (18:30 +0000)
Added initial work to support registering commands through the logical
theme system. Includes docs changes and example.

Not yet covered via testing.

app/Console/Kernel.php
app/Theming/ThemeService.php
dev/docs/logical-theme-system.md

index 11c8018c8d6fca1cec1191c011938d20c2478fe1..02c8c00e61135c6c33c86831944350b6f2eeb36c 100644 (file)
@@ -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);
+        }
     }
 }
index 602abaf1c5a35e4845cbde67aec8981071271f5c..f095c7a8e7fb1716d4caa77495887acd2e51f898 100644 (file)
@@ -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.
      */
index b950d7df95cb656cc51506f4d2bdd64fab2e75e3..4d6ed719b5720e7e3d546aa6ff19955eaa3944ba 100644 (file)
@@ -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
+<?php
+
+use BookStack\Facades\Theme;
+use Illuminate\Console\Command;
+
+class MeowCommand extends Command
+{
+    protected $signature = 'bookstack:meow';
+    protected $description = 'Say meow on the command line';
+
+    public function handle()
+    {
+        $this->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. 
Morty Proxy This is a proxified and sanitized view of the page, visit original site.