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 :
<? /* * class: axEvent * file: class.axEvent.php * author: Pawel Plewa * mail: pawel@axl.pl * */ class axEvent { private $Pversion = '0.1'; private $Pname; function GetVer(){ } function __construct(){ $this->name = __CLASS__; } public function FireEvent($c, $f, $suffix = EV_BEFORE, $param_values) { $ref = new ReflectionMethod($c, $f); $params = $ref->getParameters(); foreach($params as $i => $param) { if (($param->isOptional()) && ($param->isDefaultValueAvailable())) { } } $aParams['org_params']= $param_values; $event_name = $ref->class.'.'.EV__ON.'.'.$suffix.'.'.$f; $this->main_events[$c][$event_name]['event_params'] = $aParams; $to_do = null; $to_do = $this->main_events[$c][$event_name]['listeners']; } foreach($to_do as $key => $value) { $value['fArg']['cArg'] = $this->main_events[$c][$event_name]['event_params']; $value['fArg']['cEName'] = $event_name; return call_user_func($value['fName'], $value['fArg']); } else { return call_user_func($value['fName']); } } } } public function RegisterListener($event, $callback) { } return $arg[0]['cArg']; } else { return false; } } return $arg[0]['cEName']; } } ?>
przyklad wykorzystania
<?php require_once('class.axEvent.php'); //przykladowa klasa ktora nic nie robi , posiada tylko dwie metody, Add() oraz Drop() class db { function Add($fID = 0, $Name = 1) { $axe->FireEvent(__CLASS__, __FUNCTION__, EV_BEFORE, $ArgList); //uruchomienie zdarzenia typu Before=>db.On.Before.Add //operacje zwiazane z dodawanie rekordow $axe->FireEvent(__CLASS__, __FUNCTION__, EV_AFTER, $ArgList); //uruchomienie zdarzenia typu After=>db.On.After.Add } function Drop($fID = 0, $Name = 3) { $axe->FireEvent(__CLASS__, __FUNCTION__, EV_BEFORE, $ArgList); //uruchomienie zdarzenia typu Before=>db.On.Before.Drop } } //funkcje obslugujace zdarzenia function WykonajPrzedDodaniem() { $vArg = axEvent::GetCallerArgs($arg); echo '<br/>[DBADD] Rozpoczeto dodawanie do bazy z parametrami ('.$vArg[0][0].'='.$vArg[0][1].' , '.$vArg[1][0].'='.$vArg[1][1].')'; } function WykonajPoDodaniu(){ $cArg = axEvent::GetCallerArgs($arg); echo '<br/>[DBADD] Zakonczono dodawanie do bazy z parametrami ('.$cArg[0][0].'='.$cArg[0][1].' , '.$cArg[1][0].'='.$cArg[1][1].')'; } function InformujZnajomego(){ $cArg = axEvent::GetCallerArgs($arg); } function AkcjaPoDel(){ $vArg = axEvent::GetCallerArgs($arg); echo '<br/>[DBDEL] Przed kasowaniem z bazy z parametrami ('.$vArg[0][0].'='.$vArg[0][1].' , '.$vArg[1][0].'='.$vArg[1][1].')'; } //-------------------------------- //tworzymy globalny obiekt axEvent $axe = new axEvent(); //przed utworzeniem instancji obiektu trzeba zdefiniowac akcje na jakie chcemy aby
on reagowal //skladnia $axe->RegisterListener($event_name,$callback,$params...) $axe->RegisterListener('db.On.Before.Add', 'WykonajPrzedDodaniem', 'parametr 1', 'parametr 2'); $axe->RegisterListener('db.On.Before.Add', 'InformujZnajomego', 'tajnY@Net', 'Helo','tresc wiadomosci'); $axe->RegisterListener('db.On.After.Add', 'WykonajPoDodaniu', 'parametr 55', 'parametr 66'); $axe->RegisterListener('db.On.Before.Drop', 'AkcjaPoDel', 'abc', 'def'); $db = new db(); $db->Add(12, 4); $db->Add(27, 11); $db->Drop(); ?>
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