Rozdiel medzi factory a service + viacnásobná použite formulára
- jsvelta
- Člen | 39
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
- 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
- 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
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
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)
- Jiří Nápravník
- Člen | 710
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