Changed how the command registration was handled due to complications of
action order found during testing. Now the theme service will resolve
and directly register the command on the Kernel instead of them being
fetched from the ThemeService from within Kernel.
More direct, Seems to work.
namespace BookStack\Console;
namespace BookStack\Console;
-use BookStack\Facades\Theme;
-use BookStack\Theming\ThemeService;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
-use Symfony\Component\Console\Command\Command;
class Kernel extends ConsoleKernel
{
class Kernel extends ConsoleKernel
{
*/
protected function commands()
{
*/
protected function commands()
{
- // Default framework command loading from 'Commands' directory
$this->load(__DIR__ . '/Commands');
$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;
namespace BookStack\Theming;
use BookStack\Auth\Access\SocialAuthService;
+use Illuminate\Contracts\Console\Kernel;
use Symfony\Component\Console\Command\Command;
class ThemeService
{
protected $listeners = [];
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.
/**
* Listen to a given custom theme event,
* setting up the action to be ran when the event occurs.
*/
public function registerCommand(Command $command)
{
*/
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);
use BookStack\Entities\Tools\PageContent;
use BookStack\Facades\Theme;
use BookStack\Theming\ThemeEvents;
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\Http\Request;
use Illuminate\Http\Response;
+use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\File;
use League\CommonMark\ConfigurableEnvironmentInterface;
use Illuminate\Support\Facades\File;
use League\CommonMark\ConfigurableEnvironmentInterface;
$this->assertStringContainsString('donkey=donut', $redirect);
}
$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
protected function usingThemeFolder(callable $callback)
{
// Create a folder and configure a theme
File::deleteDirectory($themeFolderPath);
}
}
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