From 27e1e0c94a298e1fa2ac2d040e0e7e5fa63a4e0d Mon Sep 17 00:00:00 2001 From: hussein guettaf Date: Mon, 28 Jul 2014 16:27:02 +0100 Subject: [PATCH] Eventfull fixed. Observers are not passed as objects though but instantiated and notified on event. --- library/event/eventfull.php | 67 ++++++++++++++--------- library/interfaces/phiberEventSubject.php | 4 +- 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/library/event/eventfull.php b/library/event/eventfull.php index 4de686c..1f760cb 100644 --- a/library/event/eventfull.php +++ b/library/event/eventfull.php @@ -6,7 +6,7 @@ use Phiber\Session\session; use Phiber\Event\event; -abstract class eventfull implements phiberEventSubject +class eventfull implements phiberEventSubject { public static function getEvents() { @@ -15,59 +15,74 @@ public static function getEvents() private static $event_listeners_namespace = 'phiber_event_listeners'; - public static function attach(phiberEventObserver $observer, $event = null) + + public static function attach($observer, $event = null) { if(null !== $event){ + if(strpos($event,'.') === false){ + foreach($event::getEvents() as $event){ + self::attach($observer,$event); + } + return; + } $parts = explode('.',$event); if(!session::nsExists(self::$event_listeners_namespace)){ - session::set(sha1($observer->__toString()), array($parts[0] => array($parts[1]=>$event)),self::$event_listeners_namespace); - session::set(sha1($observer->__toString()), array('object' => $observer),self::$event_listeners_namespace); + session::set(sha1($observer), array($parts[0] => array($parts[1]=>$event)),self::$event_listeners_namespace); + session::set(sha1($observer), array('object' => $observer),self::$event_listeners_namespace); }else{ - if(!session::exists(sha1($observer->__toString()), self::$event_listeners_namespace)){ - session::set(sha1($observer->__toString()), array('object' => $observer),self::$event_listeners_namespace); + if(!session::exists(sha1($observer), self::$event_listeners_namespace)){ + session::set(sha1($observer), array('object' => $observer),self::$event_listeners_namespace); } - session::append(sha1($observer->__toString()), array($parts[0] => array($parts[1],$event)),self::$event_listeners_namespace,true); + session::append(sha1($observer), array($parts[0] => array($parts[1],$event)),self::$event_listeners_namespace,true); } }else{ foreach(static::getEvents() as $event){ self::attach($observer,$event); } - } - - } - public static function detach(phiberEventObserver $observer, $event = null) + } + + } + public static function detach($observer, $event = null) { if(null !== $event){ + if(strpos($event,'.') === false){ + foreach($event::getEvents() as $event){ + self::detach($observer,$event); + } + return; + } $parts = explode('.',$event); - if(isset($_SESSION[self::$event_listeners_namespace][sha1($observer->__toString())][$parts[0]])){ - $path = $_SESSION[self::$event_listeners_namespace][sha1($observer->__toString())][$parts[0]]; - } + if(isset($_SESSION[self::$event_listeners_namespace][sha1($observer)][$parts[0]])){ + $path = $_SESSION[self::$event_listeners_namespace][sha1($observer)][$parts[0]]; + } $path[$parts[1]] = null; $path = array_filter($path,'strlen'); if(count($path)){ - $_SESSION[self::$event_listeners_namespace][sha1($observer->__toString())][$parts[0]] = $path; + $_SESSION[self::$event_listeners_namespace][sha1($observer)][$parts[0]] = $path; return; } } - session::delete(sha1($observer->__toString()), self::$event_listeners_namespace); - - } - public static function notify(event $event) + session::delete(sha1($observer), self::$event_listeners_namespace); + + } + public static function notify(event $event) { - - if(session::isStarted() && is_array(session::getNS(self::$event_listeners_namespace))){ + + if(session::isStarted() && is_array(session::getNS(self::$event_listeners_namespace))){ foreach(session::getNS(self::$event_listeners_namespace) as $observer){ - if(isset($observer[strstr($event->current['event'],'.',true)]) && in_array($event->current['event'], $observer[strstr($event->current['event'],'.',true)])) - $observer['object']->update($event); - } - } - + $obs = $observer['object']; + $observer['object'] = new $obs; + if(isset($observer[strstr($event->current['event'],'.',true)]) && in_array($event->current['event'], $observer[strstr($event->current['event'],'.',true)])) + $observer['object']->update($event); + } + } + } } diff --git a/library/interfaces/phiberEventSubject.php b/library/interfaces/phiberEventSubject.php index 8a8d704..54630cf 100644 --- a/library/interfaces/phiberEventSubject.php +++ b/library/interfaces/phiberEventSubject.php @@ -16,12 +16,12 @@ public static function notify(\Phiber\Event\event $event); * * @param \Phiber\Interfaces\phiberEventObserver $observer */ - public static function attach(phiberEventObserver $observer); + public static function attach($observer); /** * * @param \Phiber\Interfaces\phiberEventObserver $observer */ - public static function detach(phiberEventObserver $observer); + public static function detach($observer); } ?> \ No newline at end of file