/** * Connect events to dispatcher * @param EventDispatcherInterface $dispatcher * @param object|array $connector * <br><u>Available formats</u>:<br> * Associative array: event to methods * <p><pre>[{event_name} => {method_name}, ...]</pre></p> * List of events * <p><pre>[{event_name1}, {event_name2}, ...]</pre></p> * Object with constants containing 'event' keyword * <p>Search list of class constants and matches any name or value that contains 'event' keyword<br> * If value is matched it will be trimmed from 'event' keyword otherwise raw value is used</p> * * @return self */ protected function connect(EventDispatcherInterface $eventDispatcher, $connector) : self { $methods = get_class_methods($this); $methodsMap = []; $mapper = []; $normalizedEventName = function ($event) { $eventName = strtr($event, '_', ''); if (($pos = mb_stripos($eventName, 'event')) !== false) { $event = mb_substr($eventName, $pos + 5); } return mb_strtolower($event); }; foreach ($methods as $method) { $methodsMap[$method] = mb_strtolower($method); } if (is_object($connector) || is_string($connector)) { $reflection = new \ReflectionClass($connector); $constants = $reflection->getConstants(); foreach ($constants as $const => $event) { if (($method = array_search($normalizedEventName($event), $methodsMap)) !== false || ($method = array_search($normalizedEventName($const), $methodsMap)) !== false) { $mapper[$event][] = $method; } } } elseif (is_array($connector)) { if (ArrayHelper::isAssoc($connector)) { foreach ($connector as $event => $method) { $mapper[$event] = ArrayHelper::forceArray($method); } } else { foreach ($connector as $event) { if (($method = array_search($normalizedEventName($event), $methodsMap)) !== false) { $mapper[$event][] = $method; } } } } foreach ($mapper as $eventName => $methods) { foreach ($methods as $method) { $eventDispatcher->addListener($eventName, [$this, $method]); } } return $this; }
/** * Prepare columns query part<br> * If columns are associative array then they should be in form of: [{column_name} => {column_alias}, ...] * @param array|string $columns */ protected function prepareColumnsList($columns) { if (is_array($columns)) { if (ArrayHelper::isAssoc($columns)) { array_walk($columns, function (&$v, $k) { $v = "{$this->getDatabase()->escapeColumnName($k)} as {$v}"; }); return implode(', ', $columns); } else { return implode(', ', array_map([$this->getDatabase(), 'escapeColumnName'], $columns)); } } return $columns; }