Zavolání rutiny před provedením metody
- Bilbo
- Člen | 16
Ahoj, chci se zeptat, zda jde v Nette nějak jednoduše udělat, abych si
nastavil určitý kus kódu (rutinu), která se například provede před
každou metodou ve třídě (jedná se o přepsání jednoho statického
atributu).
Asi bych to zvládnul udělat předefinováním __call() a __callstatic() a pak
v nich zavolat funkci parent objektu, ale zajímá mě, jestli na to není
nějaké čisté \Nette\Object řešení.
Navíc v prvním případě bych ty metody musel mít nějak spešl označené,
když bych je volal, aby se to do magických metod dostalo. Já bych chtěl
rovnou volat metody s původním jménem, pouze k tomu nastavit nějaký
callback/událost… v tomhle mám pořád trochu zmatek :-)
Díval jsem se dokumentace do části „Rozšíření jazyka PHP“, ale
nevím, co z toho bych měl na tohle použít.
Díky moc :-)
Editoval Bilbo (25. 6. 2011 23:33)
- Filip Procházka
- Moderator | 4668
No trochu mi to co chceš připomíná Aspektově Orientované Programování, každopádně nevíme jaký typ třídy myslíš (presenter, komponentu, model, …)
Pokud nějaký tvůj model, pak můžeš použít události, ale plně zautomatizovat to nejde, pokud nepoužiješ AOP
class Foo extends Nette\Object
{
/** @var array */
public $onCall = array();
/** @var int */
public static $prop = 0;
public function bar()
{
$this->onCall($this);
echo "bar " . self::$prop;
}
public function bazRaketak()
{
$this->onCall($this);
echo "baz raketak " . self::$prop;
}
}
$foo = new Foo;
$foo->onCall[] = function (Foo $foo) { $foo::$prop += 1; };
$foo->bar();
$foo->bazRaketak();