Kesovanie – ako zistit filename podedenej triedy z jej predka
- edke
- Člen | 198
Mam situaciu, v ktorej je vyhodne rozdelit Control na zakladnu triedu BaseControl a viacero finalnych Control's, ktore ju budu dedit. Ak sa ma spravne nakonfigurovat kesovanie, vzdy je dolezite nastavit kes tak, aby expirovala v pripade, ze dojde k modifikacii vsetkych casti, ktore sa na jej obsahu podielaju.
A tu je kamen urazu. Ak chcem kes ukladat v predkovi, ako sa dostanem elegantne a plne v zmysle DRY ku nazvu suboru finalneho Control-u ($extendedClassFileName v priklade) ?
Vsetky riesenia problemu, ktore ma napadaju, nie su v zmysle DRY:
- predka a finalne triedy dat do jedneho php suboru, potom na zaklade __FILE__ modification sa spravne invaliduje kes generovana z tychto tried (narusa to pravidlo jedna trieda = jeden subor)
- posuvat si nazov z extendu do parentu cez overridovany render() ⇒ parent::render(__FILE__) (kazdy extend bude musiet obsahovat spominany render, v pripade viacnasobneho dedenia sa to dalej komplikuje)
Narazil som na obmedzenie samotneho jazyka ? Ak mate nejake riesenie, sem s nim.
Priklad:
class FinalControl extends BaseControl {
}
class BaseControl extends Control {
public function render() {
ob_start();
echo $template->render();
$buffer= ob_get_clean();
$cache = Enviromnent::getCache();
$cache->save($key, $buffer, array(
Cache::FILES => array(
__FILE__,
__DIR__.'/'.__CLASS__.'.phtml',
$extendedClassFileName
)
);
}
}
- Patrik Votoček
- Člen | 2221
Nette\Reflection\ClassReflection::from(get_called_class())->getFileName();
- edke
- Člen | 198
vrtak-cz wrote:
Nette\Reflection\ClassReflection::from(get_called_class())->getFileName();
Fuuu, tak to je parada. Pozeral som na reflections v Nette ale prehliadol som dole „Methods Inherited From ReflectionClass (Internal Class)“ !!
Az na malu zmenu, kedze get_called_class() je Late Static Binding, teda PHP 5.3 a ja potrebujem PHP 5.2. Ale bez problemov bezi:
ClassReflection::from($this)->getFileName();
A dokonca cez getParentClass():
ClassReflection::from($this)->getParentClass()->getFileName();
viem zistit vsetky subory pre vsetky triedy, ak je viacnasobne dedenie ! Teda vsetko co treba na idealny cache building :))
Vrela vdaka !!
Editoval edke (30. 6. 2010 17:12)