17 use Psr\Log\LoggerInterface;
63 if (!$this->isInitialized) {
64 $this->objectManager = GeneralUtility::makeInstance(ObjectManager::class);
65 $logManager = GeneralUtility::makeInstance(LogManager::class);
66 $this->logger = $logManager->getLogger(self::class);
67 $this->isInitialized =
true;
82 public function connect($signalClassName, $signalName, $slotClassNameOrObject, $slotMethodName =
'', $passSignalInformation =
true)
86 if (is_object($slotClassNameOrObject)) {
87 $object = $slotClassNameOrObject;
88 $method = $slotClassNameOrObject instanceof \Closure ?
'__invoke' : $slotMethodName;
90 if ($slotMethodName ===
'') {
91 throw new \InvalidArgumentException(
'The slot method name must not be empty (except for closures).', 1229531659);
93 $class = $slotClassNameOrObject;
94 $method = $slotMethodName;
100 'passSignalInformation' => $passSignalInformation ===
true,
104 if (!is_array($this->slots[$signalClassName][$signalName] ??
false) || !in_array($slot, $this->slots[$signalClassName][$signalName],
true)) {
105 $this->slots[$signalClassName][$signalName][] = $slot;
119 public function dispatch($signalClassName, $signalName, array $signalArguments = [])
122 $this->logger->debug(
123 'Triggered signal ' . $signalClassName .
' ' . $signalName,
125 'signalClassName' => $signalClassName,
126 'signalName' => $signalName,
127 'signalArguments' => $signalArguments,
130 if (!isset($this->slots[$signalClassName][$signalName])) {
131 return $signalArguments;
133 foreach ($this->slots[$signalClassName][$signalName] as $slotInformation) {
134 if (isset($slotInformation[
'object'])) {
135 $object = $slotInformation[
'object'];
137 if (!isset($this->objectManager)) {
138 throw new Exception\InvalidSlotException(sprintf(
'Cannot dispatch %s::%s to class %s. The object manager is not yet available in the Signal Slot Dispatcher and therefore it cannot dispatch classes.', $signalClassName, $signalName, $slotInformation[
'class'] ??
''), 1298113624);
140 if (!$this->objectManager->isRegistered($slotInformation[
'class'])) {
141 throw new Exception\InvalidSlotException(
'The given class "' . $slotInformation[
'class'] .
'" is not a registered object.', 1245673367);
143 $object = $this->objectManager->get($slotInformation[
'class']);
146 if (!method_exists($object, $slotInformation[
'method'])) {
147 throw new Exception\InvalidSlotException(
'The slot method ' . get_class($object) .
'->' . $slotInformation[
'method'] .
'() does not exist.', 1245673368);
150 $preparedSlotArguments = $signalArguments;
151 if ($slotInformation[
'passSignalInformation'] ===
true) {
152 $preparedSlotArguments[] = $signalClassName .
'::' . $signalName;
155 $slotReturn = call_user_func_array([$object, $slotInformation[
'method']], $preparedSlotArguments);
158 if (!is_array($slotReturn)) {
159 throw new Exception\InvalidSlotReturnException(
'The slot method ' . get_class($object) .
'->' . $slotInformation[
'method'] .
'()\'s return value is of an not allowed type ('
160 . gettype($slotReturn) .
').', 1376683067);
162 if (count($slotReturn) !== count($signalArguments)) {
163 throw new Exception\InvalidSlotReturnException(
'The slot method ' . get_class($object) .
'->' . $slotInformation[
'method'] .
'() returned a different number ('
164 . count($slotReturn) .
') of arguments, than it received (' . count($signalArguments) .
').', 1376683066);
166 $signalArguments = $slotReturn;
170 return $signalArguments;
180 public function getSlots($signalClassName, $signalName)
182 return $this->slots[$signalClassName][$signalName] ?? [];