Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa axEvent -> prosta obsługa zdarzeń
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Tajny
Witam,

napisałem prostą klasę do obsługi zdarzeń i chciałem usłyszeć kilka komentarzy. Potrzebowałem zarządzania zdarzeniami ale w taki sposób aby funkcje zwrotne widziały jakie parametry zostały użyte przez metode wywołującą zdarzenie.


23 listopad 2006: KOD ULEGŁ ZMIANOM, PATRZ TUTAJ



Oto kod :

  1. <?
  2.  
  3. /*
  4.  * class: axEvent
  5.  * file: class.axEvent.php
  6.  * author: Pawel Plewa
  7.  * mail: pawel@axl.pl
  8.  *
  9.  */
  10.  
  11. define('EV_BEFORE','Before');
  12. define('EV_AFTER','After');
  13. define('EV_ERROR','Error');
  14. define('EV__ON','On');
  15.  
  16. class axEvent {
  17.  
  18. private $Pversion = '0.1';
  19. private $Pname;
  20.  
  21. function GetVer(){
  22. return array($this->Pversion,$this->Pname);
  23. }
  24.  
  25. function __construct(){
  26. $this->name = __CLASS__;
  27. }
  28.  
  29. private $main_events = array();
  30.  
  31. public function FireEvent($c, $f, $suffix = EV_BEFORE, $param_values) {
  32. $ref = new ReflectionMethod($c, $f);
  33. $params = $ref->getParameters();
  34. $aParams = array();
  35.  
  36. foreach($params as $i => $param) {
  37. if (($param->isOptional()) && ($param->isDefaultValueAvailable())) {
  38. if (!isset($param_values[$i])) $param_values[$i] = $param->getDefaultValue();
  39. }
  40. $aParams[] = array($param->getName(), $param_values[$i]);
  41. }
  42. $aParams['org_params']= $param_values;
  43. $event_name = $ref->class.'.'.EV__ON.'.'.$suffix.'.'.$f;
  44.  
  45. $this->main_events[$c][$event_name]['event_params'] = $aParams;
  46.  
  47. $to_do = null;
  48. if (isset($this->main_events[$c][$event_name]['listeners'])) {
  49. $to_do = $this->main_events[$c][$event_name]['listeners'];
  50. }
  51.  
  52. if (is_array($to_do))
  53. foreach($to_do as $key => $value) {
  54. if (isset($value['fName'])) {
  55. if (isset($value['fArg'])) {
  56. if (!empty($this->main_events[$c][$event_name]['event_params']))
  57. $value['fArg']['cArg'] = $this->main_events[$c][$event_name]['event_params'];
  58. $value['fArg']['cEName'] = $event_name;
  59. return call_user_func($value['fName'], $value['fArg']);
  60. } else {
  61. return call_user_func($value['fName']);
  62. }
  63. }
  64. }
  65. }
  66.  
  67.  
  68.  
  69. public function RegisterListener($event, $callback) {
  70. $c = substr($event, 0, strpos($event, '.'));
  71. $arguments = func_get_args();
  72. array_shift($arguments);
  73. array_shift($arguments);
  74. $this->main_events[$c][$event]['listeners'][] = array('fName' => $callback,'fArg' => $arguments);
  75. }
  76.  
  77.  
  78. public static function GetCallerArgs($arg) {
  79. if (isset($arg[0]['cArg'])) {
  80. return $arg[0]['cArg'];
  81. } else {
  82. return false;
  83. }
  84. }
  85.  
  86. public static function GetActionName($arg){
  87. return $arg[0]['cEName'];
  88. }
  89. }
  90.  
  91. ?>



przyklad wykorzystania

  1. <?php
  2. require_once('class.axEvent.php');
  3.  
  4.  
  5. //przykladowa klasa ktora nic nie robi , posiada tylko dwie metody, Add() oraz Drop()
  6. class db {
  7.  
  8. function Add($fID = 0, $Name = 1) {
  9. global $axe;
  10. $ArgList = func_get_args();
  11. $axe->FireEvent(__CLASS__, __FUNCTION__, EV_BEFORE, $ArgList); //uruchomienie zdarzenia typu Before=>db.On.Before.Add
  12. //operacje zwiazane z dodawanie rekordow
  13. $axe->FireEvent(__CLASS__, __FUNCTION__, EV_AFTER, $ArgList); //uruchomienie zdarzenia typu After=>db.On.After.Add
  14. }
  15.  
  16.  
  17. function Drop($fID = 0, $Name = 3)
  18. {
  19. global $axe;
  20. $ArgList = func_get_args();
  21. $axe->FireEvent(__CLASS__, __FUNCTION__, EV_BEFORE, $ArgList); //uruchomienie zdarzenia typu Before=>db.On.Before.Drop
  22. }
  23. }
  24.  
  25.  
  26. //funkcje obslugujace zdarzenia
  27.  
  28. function WykonajPrzedDodaniem() {
  29. $arg = func_get_args();
  30. $vArg = axEvent::GetCallerArgs($arg);
  31. echo '<br/></br>--reakcja na zdarzenie '.axEvent::GetActionName($arg);
  32. echo '<br/>[DBADD] Rozpoczeto dodawanie do bazy z parametrami ('.$vArg[0][0].'='.$vArg[0][1].' , '.$vArg[1][0].'='.$vArg[1][1].')';
  33. echo '<br/>[DBADD] Parametry lokalne : '.$arg[0][0].','.$arg[0][1];
  34. }
  35.  
  36. function WykonajPoDodaniu(){
  37. $arg = func_get_args();
  38. $cArg = axEvent::GetCallerArgs($arg);
  39. echo '<br/></br>--reakcja na zdarzenie '.axEvent::GetActionName($arg);
  40. echo '<br/>[DBADD] Zakonczono dodawanie do bazy z parametrami ('.$cArg[0][0].'='.$cArg[0][1].' , '.$cArg[1][0].'='.$cArg[1][1].')';
  41. echo '<br/>[DBADD] Parametry lokalne : '.$arg[0][0].','.$arg[0][1];
  42. }
  43.  
  44. function InformujZnajomego(){
  45. $arg = func_get_args();
  46. $cArg = axEvent::GetCallerArgs($arg);
  47. echo '<br/></br>--reakcja na zdarzenie '.axEvent::GetActionName($arg);
  48. echo '<br/>[IZ] Parametry lokalne : '.$arg[0][0].','.$arg[0][1];
  49. }
  50.  
  51. function AkcjaPoDel(){
  52. $arg = func_get_args();
  53. $vArg = axEvent::GetCallerArgs($arg);
  54. echo '<br/></br>--reakcja na zdarzenie '.axEvent::GetActionName($arg);
  55. echo '<br/>[DBDEL] Przed kasowaniem z bazy z parametrami ('.$vArg[0][0].'='.$vArg[0][1].' , '.$vArg[1][0].'='.$vArg[1][1].')';
  56. echo '<br/>[DBDEL] Parametry lokalne : '.$arg[0][0].','.$arg[0][1];
  57. }
  58.  
  59. //--------------------------------
  60. //tworzymy globalny obiekt axEvent
  61. $axe = new axEvent();
  62.  
  63. //przed utworzeniem instancji obiektu trzeba zdefiniowac akcje na jakie chcemy aby
     on reagowal 
  64. //skladnia $axe->RegisterListener($event_name,$callback,$params...) 
  65. $axe->RegisterListener('db.On.Before.Add', 'WykonajPrzedDodaniem', 'parametr 1', 'parametr 2');
  66. $axe->RegisterListener('db.On.Before.Add', 'InformujZnajomego', 'tajnY@Net', 'Helo','tresc wiadomosci');
  67. $axe->RegisterListener('db.On.After.Add', 'WykonajPoDodaniu', 'parametr 55', 'parametr 66');
  68. $axe->RegisterListener('db.On.Before.Drop', 'AkcjaPoDel', 'abc', 'def');
  69.  
  70. $db = new db();
  71. $db->Add(12, 4);
  72. $db->Add(27, 11);
  73. $db->Drop();
  74. ?>



wynik dzialania


--reakcja na zdarzenie db.On.Before.Add
[DBADD] Rozpoczeto dodawanie do bazy z parametrami (fID=12 , Name=4)
[DBADD] Parametry lokalne : parametr 1,parametr 2

--reakcja na zdarzenie db.On.After.Add
[DBADD] Zakonczono dodawanie do bazy z parametrami (fID=12 , Name=4)
[DBADD] Parametry lokalne : parametr 55,parametr 66

--reakcja na zdarzenie db.On.Before.Add
[DBADD] Rozpoczeto dodawanie do bazy z parametrami (fID=27 , Name=11)
[DBADD] Parametry lokalne : parametr 1,parametr 2

--reakcja na zdarzenie db.On.After.Add
[DBADD] Zakonczono dodawanie do bazy z parametrami (fID=27 , Name=11)
[DBADD] Parametry lokalne : parametr 55,parametr 66

--reakcja na zdarzenie db.On.Before.Drop
[DBDEL] Przed kasowaniem z bazy z parametrami (fID=0 , Name=3)
[DBDEL] Parametry lokalne : abc,def


Pozdrawiam
revyag
Zły dział.
Przenoszę na algorytmy,klasy,funkcje.
Ociu
Ładniej by było jakbyś stworzył jeszcze jedną klasę, która tworzyła by takie właśnie wiadomości, lub dać to w klasie Event.

Przeczytaj Temat: EventListener :roll2:
Tajny
Hej, dzieki za uwagę , dodałem nową metodę oraz przyjemniejsze śledzenie zdarzeń razem z parametrami.

Pozdrawiam

kod klasy
  1. <?
  2.  
  3. /*
  4.  * class: axEvent
  5.  * file: class.axEvent.php
  6.  * author: Pawel Plewa
  7.  * mail: pawel@axl.pl
  8.  *
  9.  */
  10.  
  11. define('EV_BEFORE', 'Before');
  12. define('EV_AFTER', 'After');
  13. define('EV_ERROR', 'Error');
  14. define('EV__ON', 'On');
  15.  
  16. class axEvent {
  17.  
  18. private $Pversion = '0.2';
  19. public $Debug = false;
  20. public $Pname;
  21.  
  22. function GetVer(){
  23. return array($this->Pversion,$this->Pname);
  24. }
  25.  
  26. function __construct(){
  27. $this->Pname = __CLASS__;
  28. }
  29.  
  30. private $main_events = array();
  31.  
  32. public function FireEvent($c, $f, $suffix = EV_BEFORE, $param_values) {
  33. $ref = new ReflectionMethod($c, $f);
  34. $params = $ref->getParameters();
  35. $aParams = array();
  36.  
  37. foreach($params as $i => $param) {
  38. if (($param->isOptional()) && ($param->isDefaultValueAvailable())) {
  39. if (!isset($param_values[$i])) $param_values[$i] = $param->getDefaultValue();
  40. }
  41. $aParams[] = array($param->getName(), $param_values[$i]);
  42. }
  43.  
  44. $event_name = $ref->class.'.'.EV__ON.'.'.$suffix.'.'.$f;
  45.  
  46. $this->main_events[$c][$event_name]['event_params'] = $aParams;
  47.  
  48. $to_do = null;
  49. if (isset($this->main_events[$c][$event_name]['listeners'])) {
  50. $to_do = $this->main_events[$c][$event_name]['listeners'];
  51. }
  52. if (is_array($to_do)){
  53. foreach($to_do as $key => $value) {
  54. if (isset($value['fName'])) {
  55. if (isset($value['fArg'])) {
  56. if (!empty($this->main_events[$c][$event_name]['event_params']))
  57. $value['fArg']['cArg'] = $this->main_events[$c][$event_name]['event_params'];
  58. $value['fArg']['cEName'] = $event_name;
  59. if ($this->Debug) $this->DisplayMsg($c,$f,$aParams,$event_name,$value['fName'],$value['fArg']);
  60. call_user_func($value['fName'], $value['fArg']);
  61. } else {
  62. if ($this->Debug) $this->DisplayMsg($c.'.'.$f,$aParams,$value['fName'],$event_name);
  63. call_user_func($value['fName']);
  64. }
  65. }
  66. }
  67.  
  68. }
  69.  
  70.  
  71. }
  72.  
  73.  
  74. private function DisplayMsg($class,$func,$aParams,$eventName,$org_func,$orgArg=array()){
  75.  
  76. $param_s = '';
  77. foreach ($aParams as $wartosc ){
  78. $param_s.= '"'.$wartosc[0].'='.$wartosc[1].'",';
  79. }
  80.  
  81. $param_o = '';
  82. foreach ($orgArg as $klucz => $wartosc) {
  83. if (is_array($wartosc)){
  84. $param_o.='array('.$param_s.'),';
  85. } else 
  86. $param_o.='"'.$wartosc.'",';
  87. }
  88.  
  89. $msg = '<pre><br/>';
  90. $msg.= 'Zdarzenie: <b>'.$eventName.'</b> <br/>';
  91. $msg.= 'Nadawca : <b>'.$class.'.'.$func.'</b>('.$param_s.')<br/>';
  92. $msg.= 'Odbiorca : <b>'.$org_func.'</b>('.$param_o.')';
  93. $msg.= '<br/>-------------</pre>';
  94.  
  95. echo $msg;
  96. }
  97.  
  98.  
  99.  
  100. public function RegisterListener($event, $callback) {
  101. $c = substr($event, 0, strpos($event, '.'));
  102. $arguments = func_get_args();
  103. array_shift($arguments);
  104. array_shift($arguments);
  105. $this->main_events[$c][$event]['listeners'][] = array('fName' => $callback,'fArg' => $arguments);
  106. }
  107.  
  108.  
  109. public static function GetCallerArgs($arg) {
  110. if (isset($arg[0]['cArg'])) {
  111. return $arg[0]['cArg'];
  112. } else {
  113. return false;
  114. }
  115. }
  116.  
  117. public static function GetActionName($arg){
  118. return $arg[0]['cEName'];
  119. }
  120. }
  121.  
  122. ?>


przyklad wykorzystania
  1. <?
  2. require_once('class.axEvent.php');
  3. //przykladowa klasa ktora nic nie robi , posiada tylko dwie metody, Add() oraz Drop()
  4. class db {
  5.  
  6. function Add($fID = 0, $Name = 1) {
  7. global $axe;
  8. $ArgList = func_get_args();
  9. $axe->FireEvent(__CLASS__, __FUNCTION__, EV_BEFORE, $ArgList); //uruchomienie zdarzenia typu Before=>db.On.Before.Add
  10. //operacje zwiazane z dodawanie rekordow
  11. $axe->FireEvent(__CLASS__, __FUNCTION__, EV_AFTER, $ArgList); //uruchomienie zdarzenia typu After=>db.On.After.Add
  12. }
  13.  
  14.  
  15. function Drop($av = 0, $par2 = 3) {
  16. global $axe;
  17. $ArgList = func_get_args();
  18. $axe->FireEvent(__CLASS__, __FUNCTION__, EV_BEFORE, $ArgList); //uruchomienie zdarzenia typu Before=>db.On.Before.Drop
  19. }
  20. }
  21.  
  22.  
  23. //funkcje obslugujace zdarzenia
  24.  
  25. function WykonajPrzedDodaniem() {
  26. $arg = func_get_args();
  27. $vArg = axEvent::GetCallerArgs($arg);
  28. /*tutaj kod naszej funkcji*/
  29. }
  30.  
  31. function WykonajPoDodaniu(){
  32. $arg = func_get_args();
  33. $cArg = axEvent::GetCallerArgs($arg);
  34. /*tutaj kod naszej funkcji*/
  35. }
  36.  
  37. function InformujZnajomego(){
  38. $arg = func_get_args();
  39. $cArg = axEvent::GetCallerArgs($arg);
  40. /*tutaj kod naszej funkcji*/
  41. }
  42.  
  43. function AkcjaPoDel(){
  44. $arg = func_get_args();
  45. $vArg = axEvent::GetCallerArgs($arg);
  46. /*tutaj kod naszej funkcji*/
  47. }
  48.  
  49.  
  50. $axe = new axEvent(); //tworzymy globalny obiekt axEvent
  51. $axe->Debug = true; //wlaczamy debugowanie
  52. /*
  53. przed utworzeniem instancji obiektu trzeba zdefiniowac akcje na jakie chcemy aby
     on reagowal 
  54. skladnia $axe->RegisterListener($event_name,$callback,$params...) 
  55. */
  56. $axe->RegisterListener('db.On.Before.Add', 'WykonajPrzedDodaniem', 'parametr 1', 'parametr 2');
  57. $axe->RegisterListener('db.On.Before.Add', 'InformujZnajomego', 'tajnY@Net', 'Helo','tresc wiadomosci');
  58. $axe->RegisterListener('db.On.After.Add', 'WykonajPoDodaniu', 'parametr 55', 'parametr 66');
  59. $axe->RegisterListener('db.On.Before.Drop', 'AkcjaPoDel', 'abc', 'def','ghi','jkl');
  60.  
  61. $db = new db();
  62. $db->Add(12, 4);
  63. $db->Add(27, 11);
  64. $db->Drop();
  65. ?>




wynik dzialania
  1. Zdarzenie: db.On.Before.Add
  2. Nadawca : db.Add("fID=12","Name=4",)
  3. Odbiorca : WykonajPrzedDodaniem("parametr 1","parametr 2",array("fID=12","Name=4",),"db.On.Before.Add",)
  4. -------------
  5.  
  6.  
  7. Zdarzenie: db.On.Before.Add
  8. Nadawca : db.Add("fID=12","Name=4",)
  9. Odbiorca : InformujZnajomego("tajnY@Net","Helo","tresc wiadomosci",array("fID=12","Name=4",),"db.On.Before.Add",)
  10. -------------
  11.  
  12.  
  13. Zdarzenie: db.On.After.Add
  14. Nadawca : db.Add("fID=12","Name=4",)
  15. Odbiorca : WykonajPoDodaniu("parametr 55","parametr 66",array("fID=12","Name=4",),"db.On.After.Add",)
  16. -------------
  17.  
  18.  
  19. Zdarzenie: db.On.Before.Add
  20. Nadawca : db.Add("fID=27","Name=11",)
  21. Odbiorca : WykonajPrzedDodaniem("parametr 1","parametr 2",array("fID=27","Name=11",),"db.On.Before.Add",)
  22. -------------
  23.  
  24.  
  25. Zdarzenie: db.On.Before.Add
  26. Nadawca : db.Add("fID=27","Name=11",)
  27. Odbiorca : InformujZnajomego("tajnY@Net","Helo","tresc wiadomosci",array("fID=27","Name=11",),"db.On.Before.Add",)
  28. -------------
  29.  
  30.  
  31. Zdarzenie: db.On.After.Add
  32. Nadawca : db.Add("fID=27","Name=11",)
  33. Odbiorca : WykonajPoDodaniu("parametr 55","parametr 66",array("fID=27","Name=11",),"db.On.After.Add",)
  34. -------------
  35.  
  36.  
  37. Zdarzenie: db.On.Before.Drop
  38. Nadawca : db.Drop("av=0","par2=3",)
  39. Odbiorca : AkcjaPoDel("abc","def","ghi","jkl",array("av=0","par2=3",),"db.On.Before.Drop",)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.