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
{
*/
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);
+ }
}
}
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.
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.
*/
});
```
+## 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.