Anotace – vnořené pole v anotaci

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

Ahoj,
nevím jak (a jestli to vůbec jde) můžu do anotací dostat pole.

Příklad:
Chci si napsat Authorizator, který se bude řídit anotacemi, např. takovýmito:

/**
 * @secured(role=(member,admin,superadmin))
 */
class FooPresenter() {
}

Pomocí Nette reflexí ale dostanu toto:

$presenter = new Reflection\ClassType('FooPresenter');
dump( $presenter->getAnnotation('secured') );

/*
Vypíše:
ArrayObject(3) ▼ {
   role => "(member" (6)
   0 => "admin" (5)
   1 => "superadmin" (10)
}

Očekával bych:
ArrayObject(1) ▼ {
   role => ArrayObject(3) ▼ {
      0 => "member" (6),
      1 => "admin" (5),
      2 => "superadmin" (10),
   }
}
*/

Možná na to jdu špatně, díky za rady :-)

David Matějka
Moderator | 6445
+
0
-

nette to nepodporuje, taky jsem to resil, uvazoval jsem o pouziti nejakyho jinyho parseru anotaci (treba ten z doctrine), nakonec jsem to proste hodil do vice anotaci

/**
* @secured
* @role(foo, bar)
*/
Majkl578
Moderator | 1364
+
0
-

Můžeš zkusit použít doctrine/annotations, ty jsou mnohem pokročilejší. :)

nanuqcz
Člen | 822
+
0
-

Díky, nakonec jsem to vyřešil takto:

/**
 * @secured(role=member|admin|superadmin)
 */

a řetězec 'member|admin|superadmin' si už pak rozparsuji ručně. Nemusím kvůli tomu přidávat do projektu další knihovnu. A zároveň je hned na první pohled jasné, že stačí, aby byl uživatel v jedné z těchto rolí.

Editoval nanuqcz (21. 6. 2013 0:06)

Reloecc
Člen | 15
+
0
-

nanuqcz napsal(a):

Ahoj,
nevím jak (a jestli to vůbec jde) můžu do anotací dostat pole.

jen tak pro zajímavost (spíše pro nějaké budoucí návštěvníky než pro autora topicu), já použil:

/**
 * @pole({i:2,"name":"já"})
 */

ze kterého jsem si regulárně vytáhl obsah závorek a decodnul z json..

Editoval Reloecc (16. 7. 2013 17:46)

enumag
Člen | 2118
+
0
-

Pro budoucí návštěvníky: použil jsem doctrine/annotations a jsem spokojený. :-)