55 if (!$this->isInitialized) {
57 $this->isInitialized = TRUE;
74 public function connect($signalClassName, $signalName, $slotClassNameOrObject, $slotMethodName =
'', $passSignalInformation = TRUE) {
77 if (is_object($slotClassNameOrObject)) {
78 $object = $slotClassNameOrObject;
79 $method = $slotClassNameOrObject instanceof \Closure ?
'__invoke' : $slotMethodName;
81 if ($slotMethodName ===
'') {
82 throw new \InvalidArgumentException(
'The slot method name must not be empty (except for closures).', 1229531659);
84 $class = $slotClassNameOrObject;
85 $method = $slotMethodName;
91 'passSignalInformation' => $passSignalInformation === TRUE
93 if (!is_array($this->slots[$signalClassName][$signalName]) || !in_array($slot, $this->slots[$signalClassName][$signalName])) {
94 $this->slots[$signalClassName][$signalName][] = $slot;
109 public function dispatch($signalClassName, $signalName, array $signalArguments = array()) {
111 if (!isset($this->slots[$signalClassName][$signalName])) {
112 return $signalArguments;
114 foreach ($this->slots[$signalClassName][$signalName] as $slotInformation) {
115 if (isset($slotInformation[
'object'])) {
116 $object = $slotInformation[
'object'];
118 if (!isset($this->objectManager)) {
119 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);
121 if (!$this->objectManager->isRegistered($slotInformation[
'class'])) {
124 $object = $this->objectManager->get($slotInformation[
'class']);
127 if (!method_exists($object, $slotInformation[
'method'])) {
128 throw new Exception\InvalidSlotException(
'The slot method ' . get_class($object) .
'->' . $slotInformation[
'method'] .
'() does not exist.', 1245673368);
131 $preparedSlotArguments = $signalArguments;
132 if ($slotInformation[
'passSignalInformation'] === TRUE) {
133 $preparedSlotArguments[] = $signalClassName .
'::' . $signalName;
136 $slotReturn = call_user_func_array(array($object, $slotInformation[
'method']), $preparedSlotArguments);
139 if (!is_array($slotReturn)) {
141 . gettype($slotReturn) .
').', 1376683067);
142 } elseif (count($slotReturn) !== count($signalArguments)) {
144 . count($slotReturn) .
') of arguments, than it recieved (' . count($signalArguments) .
').', 1376683066);
146 $signalArguments = $slotReturn;
151 return $signalArguments;
162 public function getSlots($signalClassName, $signalName) {
163 return isset($this->slots[$signalClassName][$signalName]) ? $this->slots[$signalClassName][$signalName] : array();
static makeInstance($className)
getSlots($signalClassName, $signalName)
dispatch($signalClassName, $signalName, array $signalArguments=array())
connect($signalClassName, $signalName, $slotClassNameOrObject, $slotMethodName='', $passSignalInformation=TRUE)