Properties – nette 2.4, latte

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

Zdravím,
používám Doctrine a entity my vstupují do šablon. Všechny entity rozšiřovali Nette\Object a v latte tak používal pěkně přístup přes $item->title – který v podstatě zavolal $item->getTitle(). Od verze 2.4 bych měl implementovat traitu SmartObject, nicméně jak jej použiji, tak už bych musel u entit nadefinovat všechny s anotací @property. Ale to je nutné psát ke skoro všem atributům u entit? To tak opravdu děláte? Není to moc průdérní? Property nikde jinde nepoužívám a používám standardně gettery a settery, ale v šablonách mi přijde jaksi zbytné psát $item->getTitle()…

Samozřejmě vím, jde používt MagicAccessor z Kdyby nebo podobně, ale není nějaká cesta na to přímo v nette?

jiri.pudil
Nette Blogger | 1029
+
+5
-

Odpovím na

To tak opravdu děláte?

Když jsem hodně líný, napíšu v šabloně přímo $item->getTitle(). Ale postupem času jsem došel k tomu, že se mi nelíbí posílat do šablony entity. Proto když nejsem líný, vyrobím si z entit(y) data transfer object pro konkrétní šablonu. Takový DTO je z definice hloupá, jednoúčelová přepravka na data, takže v něm mám public properties a pokud možno co nejprimitivnější typy (stringy, čísla, datum a čas, pole vnořených DTOček místo kolekcí entit, …). Není v tom pak ani troška magie a mám striktně oddělený model (entitu) od view (DTO).

Oli
Člen | 1215
+
+2
-

Děláme to úplně stejně jako @jiri.pudil

Tharos
Člen | 1030
+
+2
-

Po vyzkoušení všemožných přístupů a opakovaném rozbití si úst se mi nejvíce osvědčilo do šablony předávat pouze skalární hodnoty a instance stdClass aka view objekty (klidně i zanořené). Samozřejmě až na nějaké výjimky, instance DateTime atp…

Je to variace na ta DTO, ale mám na to takové malé udělátko, které myslím umí slušně minimalizovat tu režii kolem.

Kombinace EntryViewer a Doctrine entit je v tomto případě kompletně non-magical.

Editoval Tharos (20. 11. 2017 11:28)