aktualizace nette a kdyby\doctrine

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

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í.

  1. Vytvořit ručně gettry a settry ve všech entitách a přepsat fasády apod.
  2. Nechat všechny proměnné v Entitách public (tohle mi nepříjde jako uplně dobrej nápad)
  3. Původní BaseEntitu si nahrát někam do Services
  4. Na GitHubu jsem našel, že by se dalo použít Kdyby\DoctrineMagicAccessors
  5. Znáte lepší řešení.

Můžete mi poradit, co je lepší zvolit?? Děkuji za případnou odpověď.

harmim
Člen | 26
+
0
-

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
+
+2
-

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).

  1. 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.
  2. 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)
  3. 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í.
  4. 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:

  1. Co je povinné (bez toho nedává entita smysl) vyžadovat v constructoru.
  2. 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).
  3. 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…
ondrusu
Člen | 118
+
0
-

@CZechBoY to bude asi ono.

Jinak pánové díky moc za super odpovědi, moc mi to pomohlo.
3× DÍKY, DÍKY, DÍKY, DÍKY

Oli
Člen | 1215
+
0
-

@CZechBoY jop, to je přesně ono ;-)