Hej, dzieki za uwagę , dodałem nową metodę oraz przyjemniejsze śledzenie zdarzeń razem z parametrami.
Pozdrawiam
kod klasy
<?
/*
* class: axEvent
* file: class.axEvent.php
* author: Pawel Plewa
* mail: pawel@axl.pl
*
*/
define('EV_BEFORE', 'Before');
class axEvent {
private $Pversion = '0.2';
public $Debug = false;
public $Pname;
function GetVer(){
return array($this->Pversion,$this->Pname); }
function __construct(){
$this->Pname = __CLASS__;
}
private $main_events = array();
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())) {
if (!isset($param_values[$i])) $param_values[$i] = $param->getDefaultValue(); }
$aParams[] = array($param->getName(), $param_values[$i]); }
$event_name = $ref->class.'.'.EV__ON.'.'.$suffix.'.'.$f;
$this->main_events[$c][$event_name]['event_params'] = $aParams;
$to_do = null;
if (isset($this->main_events[$c][$event_name]['listeners'])) { $to_do = $this->main_events[$c][$event_name]['listeners'];
}
foreach($to_do as $key => $value) {
if (isset($value['fName'])) { if (isset($value['fArg'])) { if (!empty($this->main_events[$c][$event_name]['event_params'])) $value['fArg']['cArg'] = $this->main_events[$c][$event_name]['event_params'];
$value['fArg']['cEName'] = $event_name;
if ($this->Debug) $this->DisplayMsg($c,$f,$aParams,$event_name,$value['fName'],$value['fArg']);
call_user_func($value['fName'], $value['fArg']);
} else {
if ($this->Debug) $this->DisplayMsg($c.'.'.$f,$aParams,$value['fName'],$event_name);
call_user_func($value['fName']);
}
}
}
}
}
private function DisplayMsg
($class,$func,$aParams,$eventName,$org_func,$orgArg=array()){
$param_s = '';
foreach ($aParams as $wartosc ){
$param_s.= '"'.$wartosc[0].'='.$wartosc[1].'",';
}
$param_o = '';
foreach ($orgArg as $klucz => $wartosc) {
$param_o.='array('.$param_s.'),';
} else
$param_o.='"'.$wartosc.'",';
}
$msg = '<pre><br/>';
$msg.= 'Zdarzenie: <b>'.$eventName.'</b> <br/>';
$msg.= 'Nadawca : <b>'.$class.'.'.$func.'</b>('.$param_s.')<br/>';
$msg.= 'Odbiorca : <b>'.$org_func.'</b>('.$param_o.')';
$msg.= '<br/>-------------</pre>';
}
public function RegisterListener($event, $callback) {
$this->main_events[$c][$event]['listeners'][] = array('fName' => $callback,'fArg' => $arguments); }
public static function GetCallerArgs
($arg) { if (isset($arg[0]['cArg'])) { return $arg[0]['cArg'];
} else {
return false;
}
}
public static function GetActionName
($arg){ return $arg[0]['cEName'];
}
}
?>
przyklad wykorzystania
<?
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($av = 0, $par2 = 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);
/*tutaj kod naszej funkcji*/
}
function WykonajPoDodaniu(){
$cArg = axEvent::GetCallerArgs($arg);
/*tutaj kod naszej funkcji*/
}
function InformujZnajomego(){
$cArg = axEvent::GetCallerArgs($arg);
/*tutaj kod naszej funkcji*/
}
function AkcjaPoDel(){
$vArg = axEvent::GetCallerArgs($arg);
/*tutaj kod naszej funkcji*/
}
$axe = new axEvent(); //tworzymy globalny obiekt axEvent
$axe->Debug = true; //wlaczamy debugowanie
/*
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','ghi','jkl');
$db = new db();
$db->Add(12, 4);
$db->Add(27, 11);
$db->Drop();
?>
wynik dzialania
Zdarzenie: db.On.Before.Add
Nadawca : db.Add("fID=12","Name=4",)
Odbiorca : WykonajPrzedDodaniem("parametr 1","parametr 2",array("fID=12","Name=4",),"db.On.Before.Add",)
-------------
Zdarzenie: db.On.Before.Add
Nadawca : db.Add("fID=12","Name=4",)
Odbiorca : InformujZnajomego("tajnY@Net","Helo","tresc wiadomosci",array("fID=12","Name=4",),"db.On.Before.Add",)
-------------
Zdarzenie: db.On.After.Add
Nadawca : db.Add("fID=12","Name=4",)
Odbiorca : WykonajPoDodaniu("parametr 55","parametr 66",array("fID=12","Name=4",),"db.On.After.Add",)
-------------
Zdarzenie: db.On.Before.Add
Nadawca : db.Add("fID=27","Name=11",)
Odbiorca : WykonajPrzedDodaniem("parametr 1","parametr 2",array("fID=27","Name=11",),"db.On.Before.Add",)
-------------
Zdarzenie: db.On.Before.Add
Nadawca : db.Add("fID=27","Name=11",)
Odbiorca : InformujZnajomego("tajnY@Net","Helo","tresc wiadomosci",array("fID=27","Name=11",),"db.On.Before.Add",)
-------------
Zdarzenie: db.On.After.Add
Nadawca : db.Add("fID=27","Name=11",)
Odbiorca : WykonajPoDodaniu("parametr 55","parametr 66",array("fID=27","Name=11",),"db.On.After.Add",)
-------------
Zdarzenie: db.On.Before.Drop
Nadawca : db.Drop("av=0","par2=3",)
Odbiorca : AkcjaPoDel("abc","def","ghi","jkl",array("av=0","par2=3",),"db.On.Before.Drop",)
Ten post edytował Tajny 23.11.2006, 14:09:52