Merge pull request #3072 from BookStackApp/logical_theme_commands

Support custom commands via logical theme system
This commit is contained in:
Dan Brown 2021-11-22 19:08:15 +00:00 committed by GitHub
commit c6e196989e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 57 additions and 0 deletions

View File

@ -3,6 +3,8 @@
namespace BookStack\Theming;
use BookStack\Auth\Access\SocialAuthService;
use Illuminate\Contracts\Console\Kernel;
use Symfony\Component\Console\Command\Command;
class ThemeService
{
@ -43,6 +45,16 @@ class ThemeService
return null;
}
/**
* Register a new custom artisan command to be available.
*/
public function registerCommand(Command $command)
{
/** @var \Illuminate\Foundation\Console\Kernel $consoleKernel */
$consoleKernel = app()->make(Kernel::class);
$consoleKernel->registerCommand($command);
}
/**
* Read any actions from the set theme path if the 'functions.php' file exists.
*/

View 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.

View File

@ -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!');
}
}