[2008-11-22] Anotace tříd a metod

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8227
+
0
-

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
+
0
-

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.

Jod
Člen | 701
+
0
-

Pridávam sa k pmg, hrám sa s anotáciami v acl a to, že get vracia string pri jednom parametri a objekt pri viacerých mi robí skazu. Šlo by tam dať aby sa vždy vracal objekt, alebo tam pridať nejaký príznak nato? Kukám, že to je len záležitosť jedného riadku.

David Grudl
Nette Core | 8227
+
0
-

Jj, skalár by se měl vrátit pouze v případě, že není uveden klíč (např. role). Fixnu