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 TUTAJOto kod :
<?
/*
* class: axEvent
* file: class.axEvent.php
* author: Pawel Plewa
* mail: pawel@axl.pl
*
*/
class axEvent {
private $Pversion = '0.1';
private $Pname;
function GetVer(){
return array($this->Pversion,$this->Pname); }
function __construct(){
$this->name = __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]); }
$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;
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;
return call_user_func($value['fName'], $value['fArg']);
} else {
return call_user_func($value['fName']);
}
}
}
}
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
<?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/></br>--reakcja na zdarzenie '.axEvent
::GetActionName($arg); echo '<br/>[DBADD] Rozpoczeto dodawanie do bazy z parametrami ('.$vArg[0][0].'='.$vArg[0][1].' , '.$vArg[1][0].'='.$vArg[1][1].')'; echo '<br/>[DBADD] Parametry lokalne : '.$arg[0][0].','.$arg[0
][1
]; }
function WykonajPoDodaniu(){
$cArg = axEvent::GetCallerArgs($arg);
echo '<br/></br>--reakcja na zdarzenie '.axEvent
::GetActionName($arg); echo '<br/>[DBADD] Zakonczono dodawanie do bazy z parametrami ('.$cArg[0][0].'='.$cArg[0][1].' , '.$cArg[1][0].'='.$cArg[1][1].')'; echo '<br/>[DBADD] Parametry lokalne : '.$arg[0][0].','.$arg[0
][1
]; }
function InformujZnajomego(){
$cArg = axEvent::GetCallerArgs($arg);
echo '<br/></br>--reakcja na zdarzenie '.axEvent
::GetActionName($arg); echo '<br/>[IZ] Parametry lokalne : '.$arg[0][0].','.$arg[0
][1
]; }
function AkcjaPoDel(){
$vArg = axEvent::GetCallerArgs($arg);
echo '<br/></br>--reakcja na zdarzenie '.axEvent
::GetActionName($arg); echo '<br/>[DBDEL] Przed kasowaniem z bazy z parametrami ('.$vArg[0][0].'='.$vArg[0][1].' , '.$vArg[1][0].'='.$vArg[1][1].')'; echo '<br/>[DBDEL] Parametry lokalne : '.$arg[0][0].','.$arg[0
][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
Ten post edytował Tajny 23.11.2006, 13:57:16