3
3
namespace Stub \Framework \Console \Commands ;
4
4
5
5
use Stub \Framework \Console \Base \Command ;
6
+ use Stub \Framework \Console \Base \StringDecorator as SD ;
6
7
use Stub \Framework \Contracts \Console \Commands ;
8
+ use Stub \Framework \Main \Application ;
7
9
8
10
class ListCommand extends Command implements Commands
9
11
{
@@ -13,12 +15,60 @@ public function __construct()
13
15
$ this ->description = "Выводит список всех доступных команд консольного приложения " ;
14
16
}
15
17
18
+ /**
19
+ * Основной метод команды
20
+ *--------------------------------------------------------------------------------
21
+ * Формирует список всех доступных в текущей версии SimpleStub Framework команд
22
+ * с общей информацией о действиях команд ыи параметрах.
23
+ *
24
+ * Детальная информация по каждой коменде может быть получена при использовании команды help с передачей
25
+ * в качестве параметра ей наименования команды, справку по которой нужно получить.
26
+ * @return string - возвращает отформатированную для консоли строку результата.
27
+ */
16
28
public function run (): string
17
29
{
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 ;
20
60
}
21
61
62
+ /**
63
+ * Возвращает массив всех классов приложения
64
+ *--------------------------------------------------------------------------------
65
+ * Для работы этого метода используется автозагрузчик ***composer***.
66
+ *
67
+ * ***Важно!!!***
68
+ * Должен быть сгенерирован оптимизированный автозагрузчик, используя -oпцию для работы со всеми классами.
69
+ * ***composer dump-autoload -o ***
70
+ * @return array
71
+ */
22
72
private function getAllClasses (): array
23
73
{
24
74
global $ composer ;
@@ -31,4 +81,61 @@ private function getAllClasses(): array
31
81
}
32
82
return $ allClasses ;
33
83
}
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
+ }
34
141
}
0 commit comments