cdaad2f40e
Added initial work to support registering commands through the logical theme system. Includes docs changes and example. Not yet covered via testing.
87 lines
2.2 KiB
PHP
87 lines
2.2 KiB
PHP
<?php
|
|
|
|
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.
|
|
*/
|
|
public function listen(string $event, callable $action)
|
|
{
|
|
if (!isset($this->listeners[$event])) {
|
|
$this->listeners[$event] = [];
|
|
}
|
|
|
|
$this->listeners[$event][] = $action;
|
|
}
|
|
|
|
/**
|
|
* Dispatch the given event name.
|
|
* Runs any registered listeners for that event name,
|
|
* passing all additional variables to the listener action.
|
|
*
|
|
* If a callback returns a non-null value, this method will
|
|
* stop and return that value itself.
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function dispatch(string $event, ...$args)
|
|
{
|
|
foreach ($this->listeners[$event] ?? [] as $action) {
|
|
$result = call_user_func_array($action, $args);
|
|
if (!is_null($result)) {
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
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.
|
|
*/
|
|
public function readThemeActions()
|
|
{
|
|
$themeActionsFile = theme_path('functions.php');
|
|
if ($themeActionsFile && file_exists($themeActionsFile)) {
|
|
require $themeActionsFile;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @see SocialAuthService::addSocialDriver
|
|
*/
|
|
public function addSocialDriver(string $driverName, array $config, string $socialiteHandler, callable $configureForRedirect = null)
|
|
{
|
|
$socialAuthService = app()->make(SocialAuthService::class);
|
|
$socialAuthService->addSocialDriver($driverName, $config, $socialiteHandler, $configureForRedirect);
|
|
}
|
|
}
|