<?php namespace Fury\Kernel; class Events{ /** * Events handlers storage (map) * * @var array */ private $map = []; /** * Storage for call logging * * @var array */ private $call_history = []; public $event_types = ['kernel', 'app', 'module']; public function __construct(){ $this -> map = []; foreach($this -> event_types as $type){ $this -> map[$type] = []; } } /** * Get events map * * @method get_map * * @param boolean $full_map_flag Flag. If true - returned full map with app and kernel events, else only events map of app * * @return array */ public function get_map($full_map_flag = false){ if($full_map_flag){ return $this -> map; } return $this -> map['app']; } /** * Get history of calling events handlers * * @method get_call_history * * @return array */ public function get_call_history(){ return $this -> call_history; } /** * Event generation in the right places * * @method call * * @param string $type kernel or app * @param string $event_name Uniq name of event * @param array $params Array with parameters for event handlers * * @return boolean */ private function call($type, $event_name, $params){ if(!isset($this -> map[$type][$event_name])){ return false; } foreach ($this -> map[$type][$event_name] as $i => $handler) { $log_id = $this -> log_call_history($type, $event_name, $params); $result = $handler($params); $this -> add_result_to_log_call_history($log_id, $result); } return true; } /** * logging call to history list * * @method log_call_history * * @param string $type Events type * @param string $event_name Name of events * @param array $params Parameters * * @return int Unique ID of handler call */ private function log_call_history($type, $event_name, $params){ if(!FCONF['debug']){ return false; } $log_id = uniqid(); $this -> call_history[$log_id] = [ 'type' => $type, 'event_name' => $event_name, 'params' => $params ]; return $log_id; } /** * Add result of working event handler * * @method add_result_to_log_call_history * * @param int $log_id Unique log id * @param any $result Result of working event handler */ private function add_result_to_log_call_history($log_id, $result){ if(!FCONF['debug']){ return false; } if(isset($this -> call_history[$log_id])){ $this -> call_history[$log_id]['result'] = $result; return true; } return false; } /** * Add new handler for event * * @method handler * * @param string $event_name Name of events with type. Example "app:my_event" or "kernel:some_event" * @param function $handler Anonymous function that will be the handler * * @return boolean result */ public function handler($event_name, $handler){ list($type, $event_name) = explode(':', $event_name); $type = trim(strtolower($type)); $event_name = trim($event_name); if(!isset($this -> map[$type])){ return false; } if($event_name == ''){ return false; } if(isset($this -> map[$type][$event_name]) and is_array($this -> map[$type][$event_name])){ $this -> map[$type][$event_name][] = $handler; }else{ $this -> map[$type][$event_name] = [$handler]; } return true; } public function __call($methname, $args){ foreach ($this -> event_types as $i => $type) { if(strpos($methname, $type . '_call') === false) continue; return $this -> call($type, $args[0], $args[1]); } return false; } }