Rozdiel medzi factory a service + viacnásobná použite formulára

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

Ahoj,

zaujímal by ma rozdiel medzi factory a service. V konfigurácii DI sú na to samostatné sekcie.
V jednom vlákne o formulároch David píše, že na formuláre je lepšie použiť továrnu, ale v config.neon ju pridal do sekcie services. Mám v tom guláš.

Konkrátne vymýšľam, ako vytvoriť formulár pre editáciu / pridanie užívateľa.
Obsahoval by tieto prvky:

  • username
  • password
  • passwordVerify
  • name
  • email
  • organization
  • role

Slúžil by pre:

  • registráciu nového uživateľa (teda prístupný u neprihláseného užívateľa)
  • zmenu svojich údajov (prihlásený, a id prihláseného = id editovaného)
  • pridanie / editácia ľubovolného záznamu (má na to právo – admin)

Rolu edituje iba admin (právo), ostatný ju vo forme nemajú.
Heslo je len pre nový záznam. U existujúceho špeciálna akcia na zmenu hesla (svojho, cudzieho na právo – admin).

A teraz to hlavné, ako na to. Dediť form asi nie je správne riešenie. Teda factory? Ale ako na to, keď je tam celkom dosť podmienok, na základe ktorých sa form vygeneruje.

Ďakujem za všetky rady.

vvoody
Člen | 910
+
0
-
  • David do configu nepridal form, on tam pridal továrnu ktorá ten form vytvára. Už len názov služby by ti to mohol napovedať.
  • Sekcia factories je použiteľná len vtedy ak si necháme továrničku vygenerovať z interface

Kedže v Davidovom príklade tovrárnička obsahuje aj nejakú logiku tak ju musel napísať vlastnoručne a pridať ako službu. Ak stačí inštancovanej triede (form, komponenta,..) len predať závislosti (akekolvek sluzby), tak stačí vytvoriť interface a nechať si továrničku vygenerovať DIC-om (sekcia factories, parameter implement).

jsvelta
Člen | 39
+
0
-

vvoody napsal(a):

  • David do configu nepridal form, on tam pridal továrnu ktorá ten form vytvára. Už len názov služby by ti to mohol napovedať.

Ja som písal, že pridal továrnu do sekcie services. Z toho som mal (mám) hokej.

Teda sekcia factories je na automaticky generované továrny. A sekcia servicies je teda zoznam „singletonov“, ktorá sa pomocou DI vkladajú do ostatných objektov instanciovaných pomocou nette (presenters, ostatné služby v DIC, …)?

vvoody
Člen | 910
+
0
-

Singleton je zlé pomenovanie. Singleton je veľmi špecifický návrhový vzor ktorý sa imho takmer vôbec nepoužíva (ale viem čo si tým chcel povedať). Služba je oveľa všeobecnejší pojem, v nette je ňou myslená akákoľvek inštancovaná trieda bez ohľadu na to, pomocou akého návrhového vzoru je navrhnutá. Čiže aj továrne triedy sú služby. David tu továreň vložil medzi služby preto aby mu ju DIC našiel keď si ju presenter vyžiada.

Na sekciu factories zabudni. V stable verzii nette nemá zatiaľ rozumné využitie.
Na generované továrne triedy tiež zabudni. Neuvedomil som si že táto featura je zatiaľ len v nette dev.

To že nette má v configu na jednej úrovni services aj factories domotalo veľa neskúsených programátorov. Hneď si mysleli že továrne triedy a služby sú dve striktne oddelené veci, čo je nezmysel. Každá továrna trieda môže byt zaregistrovaná ako služba ako som už písal.

Dávaj si pozor na jednu vec, keď niekto povie „továrnička“, to môže okrem továrnej triedy predstavovať aj továrnu funkciu. To sú napríklad createComponentNieco metódy presenteru, alebo akékoľvek metódy ktoré každým zavolaním vracajú novú inštanciu určitej triedy (npr komponenta). Za pomoci sekcie factories si schopný (v stable nette) vygenerovať takéto továrne metódy do DIC. V dokumentácií je opísané ako na to. A prečo je to k ničomu? Všade kde by si chcel tieto funkcie použiť, by si musel mať celý DIC čo je $container z príkladu z dokumenácie, resp starý dobrý známi $presenter->context. Kedže vývoj nette smeruje k DI dokonalosti :D tak sa snaží priamemu prístupu ku DIC (čiže aj k jeho (továrnym) metódam) úplne vyhnúť.

V nette dev pribudla možnosť pomocou sekcie factories generovať aj továrne triedy ktoré sú hneď zaregistrované ako služby čiže je ich možne ďalej predávať cez inject a autowire, čo je už v súlade s DI.

Takže sekciu factories necháp ako zoznam všetkých továrničiek v aplikácií. Je to len továreň na primitívne továrne. Ak potrebuješ továreň aj s nejakou logikou (npr. metóda process v Davidovom príklade) tak ti nezostáva nič iné ako si ju celú naprogramovať sám a vložiť ako službu.

Editoval vvoody (12. 10. 2013 16:18)

jsvelta
Člen | 39
+
0
-

Super, ďakujem za vystvetlenie.

Tada ručne si vytvorím Factory a registrujem ju ako službu. Ak by sa mi niečo nedarilo, zas sa ozvem.

Šaman
Člen | 2666
+
0
-

@vvoody: Díky, tohle mi taky nebylo jasné. Používám jen sekci services a generované továrny jsem zatím nepoužil. Myslel jsem, že v Nette 2.1 už ani sekce factories není doporučovaná.
Tohle by chtělo někam připíchnout, nebo hodit do dokumentace.

Jiří Nápravník
Člen | 710
+
0
-

Myslel jsem, že v Nette 2.1 už ani sekce factories není doporučovaná.

Naopak v Nette 2.1 byly factories přepracovány do použitelnější formy. Viz třeba článek tady: Inject a DIC továrničky