Jak používat vlastní anotace

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

Potřeboval bych pomoct s takovou akademickou otázkou, představoval bych si to nějak takhle, pro názornost zvolím systém co každý zná, eshop.

Mějmež Model Order s metodou get/setCustomerNote umožnující zadat poznámku zákazníka k objednávce, s vlastní anotací @package (vím, že ta je použita už na něco jiného):

Class OrderModel extends BaseModel
{
	private $customerNote;

	...

	/**
	* Umoznuje nastavit uzivatelskou poznamku
	* @params $customerNote uzivatelska poznamka
	* @package customerNote
	*/
	public function setCustomerNote($customerNote)
	{
		$this->customerNote = $customerNote;
	}

	/**
	* Ziskava uzivatelskou poznamku
	* @package customerNote
	* @return string
	*/
	public function getCustomerNote()
	{
		return $this->customerNote;
	}
}

v konfigu povolím package customerNote nebo naopak zakážu. Jak dosáhnu toho, aby při zakázání package customerNote vyskočila při volání této metody třebas vyjímka, že aplikace nemá tento balíček povolen, respektive, jde to nějak udělat v php?

bojovyletoun
Člen | 667
+
0
-

hmm… dávat do každé metody nějakou kontrolu se ti asi nechce…

viděl bych to na nějaký proxy návrhový vzor:
Ve skutečnosti budeš pracovat se Třídou Proxy s jednou property target: $order= new Proxy(new Order) – ta bude mít metodu __call: použije reflection metody dle jména fce v __call, zjistíš anotaci getAnnotation, kontroluješ… ->

function __call($name,$args){
	if()throw new Exc;else return
	call_user_func_array(array($this->target,$name,$args))`

akorát co s type hintingem-

Editoval bojovyletoun (25. 9. 2011 1:01)

Jan Endel
Člen | 1016
+
0
-

pravděpodobně si na to napíšu nějaký loader co mi to celé zautomatizuje takže při zavolání
$this->container->fooLoader->orderModel se model lazy vytvoří přes tu proxy a pomocí anotací loaderu (@property-read) si snadno dodělám type hinting.