Skip to content

Commit a786f82

Browse files
authored
Merge pull request #12 from SimpleREST/develop
Develop
2 parents ef3d596 + 247c1f0 commit a786f82

File tree

6 files changed

+153
-52
lines changed

6 files changed

+153
-52
lines changed

src/Console/Base/StringDecorator.php

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,33 +15,47 @@
1515
*/
1616
class StringDecorator
1717
{
18-
public function red($string): string
18+
public static function red($string): string
1919
{
20-
return ConsoleTextForegroundColorsEnum::RED . $string . ConsoleTextForegroundColorsEnum::YELLOW;
20+
return "\033[" . ConsoleTextForegroundColorsEnum::RED . "m" . $string . "\033[0m";
2121
}
2222

23-
public function green($string): string
23+
public static function green($string): string
2424
{
25-
return ConsoleTextForegroundColorsEnum::GREEN . $string . ConsoleTextForegroundColorsEnum::BLACK;
25+
return "\033[" . ConsoleTextForegroundColorsEnum::GREEN . "m" . $string . "\033[0m";
2626
}
2727

28-
public function yellow($string): string
28+
public static function yellow($string): string
2929
{
30-
return ConsoleTextForegroundColorsEnum::YELLOW . $string . ConsoleTextForegroundColorsEnum::BLACK;
30+
return "\033[" . ConsoleTextForegroundColorsEnum::YELLOW . "m" . $string . "\033[0m";
3131
}
3232

33-
public function blue($string): string
33+
public static function blue($string): string
3434
{
35-
return ConsoleTextForegroundColorsEnum::BLUE . $string . ConsoleTextForegroundColorsEnum::BLACK;
35+
return "\033[" . ConsoleTextForegroundColorsEnum::BLUE . "m" . $string . "\033[0m";
3636
}
3737

38-
public function purple($string): string
38+
public static function purple($string): string
3939
{
40-
return ConsoleTextForegroundColorsEnum::PURPLE . $string . ConsoleTextForegroundColorsEnum::BLACK;
40+
return "\033[" . ConsoleTextForegroundColorsEnum::PURPLE . "m" . $string . "\033[0m";
4141
}
4242

43-
public function brown($string): string
43+
public static function brown($string): string
4444
{
45-
return ConsoleTextForegroundColorsEnum::BROWN . $string . ConsoleTextForegroundColorsEnum::BLACK;
45+
return "\033[" . ConsoleTextForegroundColorsEnum::BROWN . "m" . $string . "\033[0m";
46+
}
47+
48+
public static function color($colorableString, string $foregroundColorsEnum = null, string $backgroundColorsEnum = null): string
49+
{
50+
$coloredString = "";
51+
if (isset($foregroundColorsEnum)) {
52+
$coloredString .= "\033[" . $foregroundColorsEnum . "m";
53+
}
54+
if (isset($backgroundColorsEnum)) {
55+
$coloredString .= "\033[" . $backgroundColorsEnum . "m";
56+
}
57+
$coloredString .= $colorableString . "\033[0m";
58+
59+
return $coloredString;
4660
}
4761
}

src/Console/Commands/ListCommand.php

Lines changed: 109 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
namespace Stub\Framework\Console\Commands;
44

55
use Stub\Framework\Console\Base\Command;
6+
use Stub\Framework\Console\Base\StringDecorator as SD;
67
use Stub\Framework\Contracts\Console\Commands;
8+
use Stub\Framework\Main\Application;
79

810
class ListCommand extends Command implements Commands
911
{
@@ -13,12 +15,60 @@ public function __construct()
1315
$this->description = "Выводит список всех доступных команд консольного приложения";
1416
}
1517

18+
/**
19+
* Основной метод команды
20+
*--------------------------------------------------------------------------------
21+
* Формирует список всех доступных в текущей версии SimpleStub Framework команд
22+
* с общей информацией о действиях команд ыи параметрах.
23+
*
24+
* Детальная информация по каждой коменде может быть получена при использовании команды help с передачей
25+
* в качестве параметра ей наименования команды, справку по которой нужно получить.
26+
* @return string - возвращает отформатированную для консоли строку результата.
27+
*/
1628
public function run(): string
1729
{
18-
var_dump($this->getAllClasses());
19-
return " Ok!";
30+
$resultString = "SimpleStub Framework " . SD::green(Application::VERSION) . "\r\n\n";
31+
$resultString .= SD::brown("Usage:\r\n");
32+
$resultString .= "command [options] [arguments]\r\n\n";
33+
$resultString .= SD::brown("Options:\r\n");
34+
$resultString .= " " . str_pad(SD::green("-h, --help"), 32);
35+
$resultString .= "Показать справку для выбранной команды, если команда не задана, будет выполнена команда" . SD::green("list") . "\r\n";
36+
$resultString .= " " . str_pad(SD::green("-q, --quiet"), 32);
37+
$resultString .= "Блокировать (не выводить / игнорировать) все сообщения (генерируемые при выполнении команды)\r\n";
38+
$resultString .= " " . str_pad(SD::green("-V, --version"), 32);
39+
$resultString .= "Вывести версию приложения (команда в данном случае не важна)\r\n";
40+
$resultString .= " " . str_pad(SD::green("-n, --no-interaction"), 32);
41+
$resultString .= "Не задавать никаких вопросов (блокировать интерактивный режим)\r\n\n";
42+
43+
$prepareListCommand = $this->getClassesByNamespace("Stub\Framework\Console\Commands\\");
44+
if (empty($prepareListCommand)) {
45+
$resultString .= SD::red("ДОСТУПНЫХ КОМАНД НЕТ!") . "\r\n";
46+
} else {
47+
$resultString .= SD::brown("Available commands:") . "\r\n";
48+
$sortclasses = $this->sortCommandsByGroup($prepareListCommand, "Stub\Framework\Console\Commands\\");
49+
foreach ($sortclasses as $key => $value) {
50+
$resultString .= SD::brown($key) . "\r\n";
51+
foreach ($value as $fclass) {
52+
/** @var Commands $currentClass */
53+
$currentClass = new $fclass();
54+
$resultString .= " " . str_pad(SD::green($currentClass->name), 32);
55+
$resultString .= $currentClass->description . "\r\n";
56+
}
57+
}
58+
}
59+
return $resultString;
2060
}
2161

62+
/**
63+
* Возвращает массив всех классов приложения
64+
*--------------------------------------------------------------------------------
65+
* Для работы этого метода используется автозагрузчик ***composer***.
66+
*
67+
* ***Важно!!!***
68+
* Должен быть сгенерирован оптимизированный автозагрузчик, используя -oпцию для работы со всеми классами.
69+
* ***composer dump-autoload -o ***
70+
* @return array
71+
*/
2272
private function getAllClasses(): array
2373
{
2474
global $composer;
@@ -31,4 +81,61 @@ private function getAllClasses(): array
3181
}
3282
return $allClasses;
3383
}
84+
85+
/**
86+
* Возвращает массив классов заданного пространства имен
87+
*--------------------------------------------------------------------------------
88+
* Формирует одномерный массив содержащий пространства имен классов входящих в заданное пространство имен
89+
* @param string $namespace - строка пространства имен в котором нужно искать все классы
90+
* @return array - результирующий массив пространств имен классов входящих в заданное
91+
*/
92+
private function getClassesByNamespace(string $namespace): array
93+
{
94+
if (0 !== strpos($namespace, '\\')) {
95+
$namespace = '\\' . $namespace;
96+
}
97+
98+
$termUpper = strtoupper($namespace);
99+
return array_filter($this->getAllClasses(), function ($class) use ($termUpper) {
100+
$className = strtoupper($class);
101+
if (
102+
0 === strpos($className, $termUpper) and
103+
false === strpos($className, strtoupper('Abstract')) and
104+
false === strpos($className, strtoupper('Interface'))
105+
) {
106+
return $class;
107+
}
108+
return false;
109+
});
110+
}
111+
112+
/**
113+
* Сортирует классы команд по группам
114+
*--------------------------------------------------------------------------------
115+
*
116+
* сортировка происходит на основании указанного в каждом классе пространства имен
117+
* @param array $prepareArrayCommandClasses Одномерный массив (пространств имен отобранных классов)
118+
* @param string $namespace Исключаемый из наименований групп корень (базовое пространство имен)
119+
* @return array Двумерный ассоциативный массив где key - это группа команд, value - одномерный
120+
* массив пространств имен классов команд, входящих в группу.
121+
*/
122+
private function sortCommandsByGroup(array $prepareArrayCommandClasses, $namespace): array
123+
{
124+
if (0 !== strpos($namespace, '\\')) {
125+
$namespace = '\\' . $namespace;
126+
}
127+
$resultClasses = array();
128+
foreach ($prepareArrayCommandClasses as $class) {
129+
$group = str_replace($namespace, "", $class);
130+
$group = str_replace(substr($group, strrpos($group, '\\', 1)), "", $group);
131+
if (isset($resultClasses[$group])) {
132+
$currentArr = $resultClasses[$group];
133+
$currentArr[] = $class;
134+
$resultClasses[$group] = $currentArr;
135+
} else {
136+
$resultClasses[$group] = array($class);
137+
}
138+
}
139+
return $resultClasses;
140+
}
34141
}

src/Console/Commands/ResetCommand.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ class ResetCommand extends Command implements Commands
1010
public function __construct()
1111
{
1212
$this->name = "reset";
13-
$this->description = "Сбрасывает заглушку к первоначальному состоянию полностью (деструктивная функция,
14-
все изменения сделанные ранее будут потеряны";
13+
$this->description = "Сбрасывает заглушку к первоначальному состоянию полностью (деструктивная функция, все изменения сделанные ранее будут потеряны";
1514
}
1615

1716
public function run(): string

src/Main/Application.php

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Application implements BaseApplicationContract
1515
*
1616
* @var string
1717
*/
18-
const VERSION = '0.0.9';
18+
const VERSION = '0.0.10';
1919

2020
/**
2121
* Массив конфигурационных параметров заглушки
@@ -47,7 +47,7 @@ public function __construct($basePath)
4747
if ($basePath) {
4848
$this->basePath = rtrim($basePath, '\/');
4949
}
50-
$this->params = include_once($this->basePath.'\config\config.php');
50+
$this->params = include_once($this->basePath . '\config\config.php');
5151
}
5252

5353
/**
@@ -64,9 +64,16 @@ public function version(): string
6464
return $formattedVersionString;
6565
}
6666

67-
public function terminate(): string
67+
/**
68+
* Метод пока пустой, зарезервирован на будущее развитие приложения
69+
* однако вызовы на него стоят, давая возможность будущей реализации
70+
* операций выполняемых при закрытии приложения (без необходимости
71+
* переписывать проект, внося изменения во фреймворк)
72+
* @return void
73+
*/
74+
public function terminate()
6875
{
69-
return "Работа приложения завершается!";
76+
7077
}
7178

7279
public function basePath(string $path = ''): string
@@ -84,27 +91,6 @@ public function getNamespace(): string
8491
return __NAMESPACE__;
8592
}
8693

87-
/**
88-
* Временно тестовый метод
89-
*
90-
* @return void
91-
* @var string $commandString
92-
*/
93-
public function execute(string $commandString)
94-
{
95-
echo $commandString;
96-
}
97-
98-
/**
99-
*Выполнение конкретной команды
100-
* @return int
101-
*/
102-
public function run(): int
103-
{
104-
echo "Нужно получить собственно наименование команды и перечень параметров команды из argv ";
105-
return 1;
106-
}
107-
10894
/**
10995
* Gets the value of the configuration parameter.
11096
*

src/Main/Console/Kernel.php

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,23 +55,16 @@ public function handle()
5555
{
5656
$this->commandStartedDateTime = new DateTime();
5757
try {
58-
$this->output->writeln($this->input->getArguments()[1]);
59-
$className = "Stub\Framework\Console\Commands\\".$this->input->getArguments()[1] . 'Command';
60-
$this->output->writeln($className);
58+
$className = "Stub\Framework\Console\Commands\\" . $this->input->getArguments()[1] . 'Command';
6159
$this->execute(new $className());
6260
} catch (Throwable $e) {
63-
$this->output->writeln("Это на случай если ошибка возникнет, ее нужно передать на обработку (оформление) добавить к ней
64-
данные разные окружения и уже потом выдать на гора...");
61+
$this->output->writeln("Ошибка при выполнении команды..." . $e);
6562
}
6663
}
6764

6865
protected function execute(Command $command)
6966
{
70-
$this->output->writeln("Инициирую обращение к геттеру имени команды \r\n");
71-
$this->output->writeln($command->getName());
72-
$this->output->writeln("Инициирую обращение к основному методу команды \r\n");
7367
$this->output->writeln($command->run());
74-
$this->output->writeln("Завершаю выполнение команды");
7568
}
7669

7770
public function sayHello(): string
@@ -86,8 +79,9 @@ public function sayHello(): string
8679
* @param $response
8780
* @return void
8881
*/
89-
public function terminate($request, $response)
82+
public function terminate($request = null, $response = null)
9083
{
84+
$this->app->terminate();
9185
exit($response);
9286
}
9387
}

src/Main/Http/Kernel.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ public function getCurrentStub(): string
6666
* @param $response
6767
* @return void
6868
*/
69-
public function terminate($request, $response)
69+
public function terminate($request = null, $response = null)
7070
{
71+
$this->app->terminate();
7172
exit($response);
7273
}
7374
}

0 commit comments

Comments
 (0)