1 | <?php |
||
15 | class MethodListenerDiscovery |
||
16 | { |
||
17 | use FilesInDirectoryExtracter; |
||
18 | |||
19 | protected $eventToListenerMap = []; |
||
20 | /** |
||
21 | * @var MessageClassDetector |
||
22 | */ |
||
23 | private $messageClassDetector; |
||
24 | |||
25 | /** @var ListenerClassValidator */ |
||
26 | private $classValidator; |
||
27 | |||
28 | /** @var ListenerMethod[] */ |
||
29 | private $allEventsListeners = []; |
||
30 | /** |
||
31 | * @var ClassSorter |
||
32 | */ |
||
33 | private $classSorter; |
||
34 | /** |
||
35 | * @var PhpClassInFileInspector |
||
36 | */ |
||
37 | private $phpClassInFileInspector; |
||
38 | |||
39 | 1 | public function __construct( |
|
40 | MessageClassDetector $messageClassDetector, |
||
41 | ListenerClassValidator $classValidator, |
||
42 | ClassSorter $classSorter, |
||
43 | PhpClassInFileInspector $phpClassInFileInspector = null |
||
44 | ) |
||
45 | { |
||
46 | 1 | $this->messageClassDetector = $messageClassDetector; |
|
47 | 1 | $this->classValidator = $classValidator; |
|
48 | 1 | $this->classSorter = $classSorter; |
|
49 | 1 | $this->phpClassInFileInspector = $phpClassInFileInspector ?? new PhpClassInFileInspector(); |
|
50 | 1 | } |
|
51 | |||
52 | |||
53 | 1 | public function discover($directory) |
|
54 | { |
||
55 | 1 | $files = $this->getFilesInDirectory($directory); |
|
56 | |||
57 | 1 | $files = $this->filterFiles($files); |
|
58 | |||
59 | 1 | foreach ($files as $file) { |
|
60 | 1 | $fullFilePath = $file; |
|
61 | |||
62 | 1 | $listenerEntries = $this->extractListenerMethodsFromFile($fullFilePath); |
|
63 | |||
64 | 1 | if ($listenerEntries) { |
|
65 | 1 | foreach ($listenerEntries as $entry) { |
|
66 | 1 | $this->addListenerToEvents($entry); |
|
67 | } |
||
68 | } |
||
69 | } |
||
70 | |||
71 | 1 | $this->allEventsListeners = $this->sortListeners($this->allEventsListeners); |
|
72 | |||
73 | 1 | foreach ($this->eventToListenerMap as $eventClass => $listeners) { |
|
74 | 1 | $this->eventToListenerMap[$eventClass] = $this->sortListeners($listeners); |
|
75 | } |
||
76 | 1 | } |
|
77 | |||
78 | /** |
||
79 | * @param string $filePath |
||
80 | * @return bool |
||
81 | */ |
||
82 | 1 | protected function isListenerFileName($filePath) |
|
86 | |||
87 | /** |
||
88 | * @param $fullFilePath |
||
89 | * @return bool|\Gica\CodeAnalysis\MethodListenerDiscovery\ListenerMethod[] |
||
90 | */ |
||
91 | 1 | protected function extractListenerMethodsFromFile($fullFilePath) |
|
101 | |||
102 | 1 | protected function addListenerToEvents(ListenerMethod $listener) |
|
107 | |||
108 | /** |
||
109 | * @param ListenerMethod[] $listeners |
||
110 | * @return ListenerMethod[] |
||
111 | */ |
||
112 | 1 | private function sortListeners($listeners) |
|
120 | |||
121 | 1 | public function getEventToListenerMap() |
|
125 | |||
126 | /** |
||
127 | * @return ListenerMethod[] |
||
128 | */ |
||
129 | 1 | public function getAllEventsListeners(): array |
|
133 | |||
134 | protected function filterFiles(array $files) |
||
140 | |||
141 | /** |
||
142 | * @param $className |
||
143 | * @return ListenerMethod[] |
||
144 | */ |
||
145 | 1 | private function findListenerMethodsInClass($className) |
|
170 | |||
171 | 1 | private function getMessageClassFromMethod(\ReflectionMethod $reflectionMethod) |
|
189 | |||
190 | 1 | private function isValidListenerMethod(\ReflectionMethod $reflectionMethod) |
|
197 | |||
198 | 1 | private function isOurMessageClass(\ReflectionClass $typeHintedClass) |
|
202 | |||
203 | 1 | private function isMethodAcccepted(\ReflectionMethod $reflectionMethod) |
|
207 | } |