Kesovanie – ako zistit filename podedenej triedy z jej predka

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
edke
Člen | 198
+
0
-

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:

  1. 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)
  2. 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
+
0
-

Nette\Reflection\ClassReflection::from(get_called_class())->getFileName();

edke
Člen | 198
+
0
-

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)