<?php
declare(strict_types=1);
/**
* @file tools/events.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2003-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class commandEvents
*
* @ingroup tools
*
* @brief CLI tool to list all events registered on the system
*/
namespace PKP\tools\event;
use Illuminate\Console\Concerns\InteractsWithIO;
use Illuminate\Console\OutputStyle;
use PKP\cliTool\CommandLineTool;
use PKP\core\EventServiceProvider;
use PKP\core\PKPContainer;
use Symfony\Component\Console\Exception\CommandNotFoundException;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\StreamOutput;
use Throwable;
define('APP_ROOT', dirname(__FILE__, 4));
require_once APP_ROOT . '/tools/bootstrap.php';
class commandEvents extends CommandLineTool
{
use InteractsWithIO;
protected const AVAILABLE_OPTIONS = [
'cache' => 'Create an Events cached version',
'clear' => 'Clear the Events cached version',
'list' => 'List all events on the system',
'usage' => 'Display the command usage'
];
/**
* @var null|string Which option will be call?
*/
protected $option = null;
/**
* Constructor
*/
public function __construct($argv = [])
{
parent::__construct($argv);
array_shift($argv);
$this->option = array_shift($argv);
if (!$this->option) {
throw new CommandNotFoundException(
'Option could not be empty! Check the usage method.',
array_keys(self::AVAILABLE_OPTIONS)
);
}
$output = new OutputStyle(
new StringInput(''),
new StreamOutput(fopen('php://stdout', 'w'))
);
$this->setOutput($output);
}
/**
* Print command usage information.
*/
public function usage()
{
$this->line('<comment>Usage:</comment>');
$this->line('command [arguments]' . PHP_EOL);
$this->line('<comment>Available commands for the "events" namespace:</comment>');
$width = $this->getColumnWidth(array_keys(self::AVAILABLE_OPTIONS));
foreach (self::AVAILABLE_OPTIONS as $commandName => $description) {
$spacingWidth = $width - Helper::width($commandName);
$this->line(
sprintf(
' <info>%s</info>%s%s',
$commandName,
str_repeat(' ', $spacingWidth),
$description
)
);
}
}
/**
* Retrieve the columnWidth based on the commands text size
*/
protected function getColumnWidth(array $commands): int
{
$widths = [];
foreach ($commands as $command) {
$widths[] = Helper::width($command);
}
return $widths ? max($widths) + 2 : 0;
}
/**
* List all events registered
*/
protected function list(): void
{
$eventServiceProvider = app()
->makeWith(
EventServiceProvider::class,
['app' => PKPContainer::getInstance()]
);
$events = [];
$rawEvents = $eventServiceProvider->getEvents();
foreach ($rawEvents as $event => $listeners) {
$events[] = [$event, implode(', ', $listeners)];
}
$this->table(['Event', 'Listeners'], $events);
}
/**
* Clean the Event cached file
*/
protected function clear(): void
{
EventServiceProvider::clearCache();
$this->getOutput()->success('Cache cleared!');
}
/**
* Create an Event cached file
*/
protected function cache(): void
{
EventServiceProvider::clearCache();
$eventServiceProvider = app()
->makeWith(
EventServiceProvider::class,
['app' => PKPContainer::getInstance()]
);
// Rebuild the cache
$eventServiceProvider->getEvents();
$this->getOutput()->success('Cache rebuilt!');
}
/**
* Parse and execute list event command
*/
public function execute()
{
if (!isset(self::AVAILABLE_OPTIONS[$this->option])) {
throw new CommandNotFoundException(
sprintf('Option "%s" does not exist.', $this->option),
array_keys(self::AVAILABLE_OPTIONS)
);
}
$this->{$this->option}();
}
}
try {
$tool = new commandEvents($argv ?? []);
$tool->execute();
} catch (Throwable $e) {
if ($e instanceof CommandNotFoundException) {
$output = new OutputStyle(
new StringInput(''),
new StreamOutput(fopen('php://stdout', 'w'))
);
$alternatives = $e->getAlternatives();
$message = count($alternatives) > 1 ? 'Did you mean one of those?' : 'Did you mean this?';
$message .= PHP_EOL . implode(PHP_EOL, $alternatives);
$output->block(
[$e->getMessage(), $message],
null,
'fg=white;bg=red',
' ',
true
);
exit;
}
throw $e;
}
|