aktualizace nette a kdyby\doctrine
- ondrusu
- Člen | 118
Zdravím, potřeboval bych poradit. Říkal jsem si, že udělám aktualizaci
Nette a všech knihoven (přes composer).
Po aktualizaci jsem zjistil, že jsem měl nějakou starší verzi
Kdyby\Doctrine, kde původně byla „BaseEntity“, která „sama“
vytvářela gettry
, settry
(například).
Zajímalo by mě co je správnější řešení.
- Vytvořit ručně
gettry
asettry
ve všech entitách a přepsat fasády apod. - Nechat všechny proměnné v Entitách
public
(tohle mi nepříjde jako uplně dobrej nápad) - Původní
BaseEntitu
si nahrát někam do Services - Na GitHubu jsem našel, že by se dalo použít Kdyby\DoctrineMagicAccessors
- Znáte lepší řešení.
Můžete mi poradit, co je lepší zvolit?? Děkuji za případnou odpověď.
- harmim
- Člen | 26
Dočasně můžeš použít MagicAccessors
, časem by ses ale
měl dostat do fáze, kde budeš mít v každé entitě napsané všechny
potřebné gettry a settry. Já když si vytvořím novou entitu, tak tam
používám MagicAccessors
a tuto traitu od tam vyhodím ve
chvíli, když vím, jak se ta entita má chovat, tzn. už má napsané všechny
gettry a settry, která mít má, aby fungovala tak jak má.
Zda je toto řešení nejlepší to nevím. Byl bych rád, kdyby mi to někdo potvrdil nebo vyvrátil.
Editoval harmim (26. 7. 2016 21:14)
- Oli
- Člen | 1215
Ahoj,
Krátká odpověď by byla 1), ale vyjádřím se ke všem bodům jak to
vnímám já (neříkám, že to tak je best practice).
- Tohle je špatně, (skoro) nikdy by žádná třída neměla mít public property. Jedná se o vnitřní stav a ty můžeš chtít spolu s nějakým nastavením nastavit i něco jiného. Pokud by jsi obešel setter, tak si můžeš rozbít vnitřní stav třídy.
- Ona už neexistuje, protože @FilipProcházka došel k názoru, že to není best practice. (předpokládám, že proto ji vyhodil)
- Tohle tam je zejména pro prototypování. Aby jsi nemusel psát settry a gettry při vývoji, kdy ještě uplně přesně nevíš jak to bude. Tak přistupuješ přímo k property, ale pak to odstraníš a uděláš si vlastní rozhraní.
- Touhle cesou bych šel já. Někde tu na foru je příspěvek od @Tharos, který naprosto dokonale shrnul jak udělat rozhraní entity tak aby byli mezi sebou konzistentní. Zkus si ho najít!
Obecně bych ale doporučil:
- Co je povinné (bez toho nedává entita smysl) vyžadovat v constructoru.
- Co je neměnné (nastaví se jednou a pak se už nemění) vůbec nebude mít setter, nastaví se v constructoru a bude mít jen getter).
- Snažit se napsat si rozhraní tak aby „nešlo rozbít“. Pokud
například nastavuješ něco pomocí setteru a to dává smysl jen pokud se
nastaví i něco jiného tak to nastavit v jednom kroku (místo
setOne($one)->setTwo($two)
. Fakt hezky to popsal @Tharos v tom článku jak jsem psal výše. Šlo o nějakou hru a předávali se tam předměty mezi postavami…