[2008-11-22] Anotace tříd a metod
- David Grudl
- Nette Core | 8227
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 | 8227
Jj, skalár by se měl vrátit pouze v případě, že není uveden klíč
(např. role
). Fixnu