Advertisement
NilsCorver

PHP Events

Nov 9th, 2011
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 1.38 KB | None | 0 0
  1. <?php
  2.  
  3. class Event {
  4.     static protected $_events = array();
  5.    
  6.     static public function attach ($event, $method) {
  7.         if(!is_string($event))
  8.             throw new \InvalidArgumentException('$event should be a string.');
  9.         if(!is_callable($method))
  10.             throw new \InvalidArgumentException('$method is not callable.');
  11.        
  12.         $class = get_called_class();
  13.         if(!isset(self::$_events[$class]))
  14.             self::$_events[$class] = array();
  15.         if(!isset(self::$_events[$class][$event]))
  16.             self::$_events[$class][$event] = array();
  17.  
  18.         self::$_events[$class][$event][] = $method;
  19.     }
  20.    
  21.     static public function trigger ($event, $arguments = array()) {
  22.         $class = get_called_class();
  23.         if(!isset(self::$_events[$class]) || !isset(self::$_events[$class][$event]))
  24.             return;
  25.         foreach(self::$_events[$class][$event] as $method)
  26.             call_user_func_array($method, $arguments);
  27.     }
  28. }
  29.  
  30. // the extending class
  31. class Page extends Event {
  32.     public function render ($context) {
  33.         self::trigger('before-render', array(&$context));
  34.         $result = print_r($context, true);
  35.         self::trigger('after-render', array($result));
  36.  
  37.         return $result;
  38.     }
  39. }
  40.  
  41. // in your setup file, plugins, etc.
  42. Page::attach('before-render', function ($context) {
  43.     $context['active'] = true;
  44. });
  45.  
  46. // rendering something:
  47. $page = new Page();
  48. echo $page->render(array('name' => 'Jacob'));
  49. // Array
  50. // (
  51. //  [name] => Jacob
  52. //  [active] => 1
  53. // )
  54.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement