[2008-11-22] Anotace tříd a metod
 
- David Grudl
- Nette Core | 8285
Před pár dny jsem do Nette přidal podporu anotací tříd, metod a proměnných. Myšlenka anotací pochází tuším z Javy, nicméně někteří teoretici za anotace považují i modifikátory tříd a jejich prvků, jako např. final, abstract atd.
Velmi komplexní řešení anotací už dříve naprogramoval Johno http://code.google.com/p/addendum/,
jeho řešení přistupuje k anotacím jako k samostatným třídám. Tj.
@Secured(role = "admin", level = 2) se načte jako objekt třídy
Secured, kde jsou nastavené dvě proměnné. Mně šlo spíše
o jednoduchost,
doplnit „extension methods“ pro třídy Reflection.
Hodnotou anotace může být kromě skaláru i indexované nebo asociativní pole. Přičemž výchozí hodnota je TRUE.
K čemu se anotace mohou hodit? Příklad plně využívající Nette může vypadat takto:
class AdminPresenter extends Presenter
{
	function startup()
	{
		$role = 'admin'; // výchozí role by měla být nejpřísnější
		$method = $this->formatRenderMethod($this->view);
		if ($this->reflection->hasMethod($method)) {
			$reflection = $this->reflection->getMethod($method);
			if (Annotations::has($reflection, 'secured')) {
				$role = Annotations::get($reflection, 'secured')->role;
				// -> $role = 'guest';
			}
		}
		if (!Environment::getUser()->isInRole($role)) {
			throw new BadRequestException('Unauthorized', 401);
		}
	}
	/**
	 * @secured(role=guest)
	 */
	function renderLogin()
	{
	}
}
Uvedený kód ověřuje, zda uživatel presenteru Admin má roli admin, avšak view Admin:login zobrazí i nepřihlášenému uživateli.
 
- pmg
- Člen | 372
Pěkná myšlenka. Když jsem to zkoušel, narazil na dva problémy:
- Annotations
	(143) nevrací objekt, pokud je proměnná příznaku jen jedna: pro
	@secured(role=guest)vrátíAnnotations::get($reflection, 'secured')(string) guest. To se může nehodit, když máme dvě volitelné proměnné.
- Čekal jsem, že Nette\Web\User::getRoles bude zohledňovat i zděděné role. Tohle by se možná hodilo, třeba to řešit přídavným parametrem.
Dík.
 
- David Grudl
- Nette Core | 8285
Jj, skalár by se měl vrátit pouze v případě, že není uveden klíč
(např. role). Fixnu
