Anotace a syntax
- David Grudl
- Nette Core | 8227
Téma anotací se slušně rozjíždí a mám pocit, že by to mohla být příští velká věc. Přesto je potřeba vyřešit pár klíčových věcí, jako je striktnost nebo dědičnost a přidám ještě jednu – syntax anotací.
Tady je potřeba zmínit, že samotný framework už několik dalších jazyků zavádí na různách místech. Možná až překvapí kolik jich je:
- Route:
'<presenter>/[<action>/[<id \d{1,3}>]]'
- Html:
Html::el('a lang=cs href="#" title="" selected')
- config.ini:
php.iconv.internal_encoding = "%encoding%"
- LatteFilter:
{include #this, menu => $item}
- LatteMacros:
<p n:if="true">Ahoj</p>
- Annotations:
@secured(role = "admin", level = 2)
A samozřejmě máme velmi úzce související jazyky standardizované:
- HTML:
<input lang=cs title="" selected>
- XHTML:
<input lang="cs" title="" selected="selected" />
- JSON:
{"lang": "cs", "title": "", "selected": true}
- JavaScript:
{lang: "cs", title: '', selected: true}
- PHP:
array('lang' => 'cs', 'title' => '', 'selected' => true)
Bylo by dobré jít spíš cestou sjednocení. Plné sjednocení není dost dobře možné ani vhodné, protože jde o DSL lišící se svým účelem a způsobem parsování, ale základní pravidla by měla být jednotná. Už proto, že se většina těchto jazyků točí kolem toho, jak zapsat hashtable.
- Petr Motejlek
- Člen | 293
Já znám anotace z Javy a myslím, že tam jsou velmi pěkně pořešené. Pokud bych měl hlasovat, tak bych hlasoval pro Javovskou syntax, tj. to, co uvádíš jako jazyk Annotations v první půlce příspěvku.
- paranoiq
- Člen | 392
jak až daleko bys chtěl se sjednocováním zajít?
čtyři ze zmíněných šesti příkladů mají naprosto stejný základ. vždy
jde jen o serializaci hashe
příklad s rovnítky:
Html: Html::el('a, lang=cs, href="#", title="", selected')
config.ini: php.iconv.internal_encoding="%encoding%"
LatteFilter: {include #this, menu=$item}
Annotations: @secured(role=admin, level=2)
příklad s dvojtečkami:
Html: Html::el('a, lang: cs, href: "#", title: "", selected')
config.ini: php.iconv.internal_encoding: "%encoding%"
LatteFilter: {include #this, menu: $item}
Annotations: @secured(role: admin, level: 2)
jen routy jsou dost specifické a u LatteMacros je asi účelem aby vypadaly jako běžné html atributy
Editoval paranoiq (30. 4. 2010 13:13)
- David Grudl
- Nette Core | 8227
On je tam ve skutečnosti ještě jeden drobný rozdíl, vlastně docela dramatický. Spíš než
Html: Html::el('a, lang=cs, href="#", title="", selected')
se očekává
Html: Html::el('a lang=cs href="#" title="" selected')
Viděl bych to tak, že =
a :
bude mít odlišné
chování. Zatímco za rovnítkem musí být právě jeden token a čárka bude
nepovinná, za dvojtečkou se bere vše až do oddělovače.
- David Grudl
- Nette Core | 8227
Na konfiguraci, na anotace a například zmíněný konstruktor třídy Html.
V šablonách bude parser jiný, ale bylo by fajn zachovat příbuzné konvence. I když to asi vždy úplně nepůjde.
- Cifro
- Člen | 245
Honzo to práve v tvojom Ormione som potreboval.
/**
* @hasOne(name = layoutTemplate, referencedEntity = Models\Template, column = layoutTemplateId, referencedColumn = id, conditions = "type=layout")
*/
Potreboval som doplniť to conditions
pre upresnenie vyhľadania
záznamu. Odelené čiarkamy by mi veľmi nepomohlo lebo som potreboval pole
kľúč => hodnota
, tak som použil parse_str()
,
kde potom reťazec musí byť v tvare napr.
conditions="type=layout&published=1&allowed=1"
. Nie je to
extra najlepšie, ale funguje no…
- paranoiq
- Člen | 392
Cifro napsal(a):
Je možné v anotáciách definovať pole? Čo som pozeral do parsera, tak múdry som z toho nebol.
v předchozí implementaci fungovalo následující, ale nevím, zda je to stále podporováno:
/**
* @anotace(1);
* @anotace(2);
*/
// výsledek: [1,2]
Editoval paranoiq (10. 6. 2010 12:51)
- Patrik Votoček
- Člen | 2221
paranoiq napsal(a):
v předchozí implementaci fungovalo následující, ale nevím, zda je to stále podporováno:
/** * @anotace(1); * @anotace(2); */ // výsledek: [1,2]
V nové verzi záleží na tom jak k tomu přistupuješ. https://doc.nette.org/…tion/anotace
- Honza Marek
- Člen | 1664
redhead napsal(a):
Já spíš myslel toto:
/** @anotace(abc = 1, pole = [a = 1, b = 2, ...]) */ pak $an->abc == 1 $an->pole == array('a' => 1, 'b' => 2, ...)
Za tohle bych se velmi, ale opravdu velmi přimlouval.
- Mikulas Dite
- Člen | 756
Jestli se i pro anotace bude používat Neon parser, tak to bude fungovat pěkně.
- redhead
- Člen | 1313
Už kdysi dávno jsem to navrhoval tu: https://forum.nette.org/…seni-anotaci?…
Bez nějaké velké odezvy.. (Je tam psáno i o eval()u, že by se dali parsovat i nějaké složitější jazykové konstrukce, ale to bych vypustil, prostě jenom podpora pole, by byla fakt pecka)