Práce se základním modelem
- Neo-Mike
- Člen | 22
Zdravím, tak jsem se po určité době dozvěděl, že práce s databází
by neměla být v presenteru, ale spíše se hodí do modelu.
Vytvořil jsem si tedy základní model BaseManager, který obsahuje proměnou
table(proměna pro určení nad jakou tabulkou v databázi se pracuje,
dále v modelu mám základní funkce, které jsou používány téměř ve
všech presenterech. Dále si pro každý presenter vytvořím nový model,
který rozšiřuje BaseManager a nastavuje proměnnou table.
Otázka teda zní, jak moc je optimální vytvářet nový model vlastně jen
pro jeden řádek, který nastavuje proměnnou? Neporadíte efektivnější
způsob?
- Neo-Mike
- Člen | 22
První odkaz co jsi mi poslal, jsem už nastudoval. Tak jsem se právě
dozvěděl, že by práce s databázi měla být v modelu. Původně jsem
vycházel z QuickStartu, tam je práce s databází v presenteru. V Nette
dělám teprve svůj druhý projekt, ale i tak se snažím dodržovat určité
správné postupy.
Co jsem se díval na tvůj odkaz na githubu, tak to mam řešeno přesně tak.
Hlavní funkce co se sdílí mám u BaseManager (u tebe Repository), a potom
mám další Managery, které rozšiřují právě BaseManager. Jen bych na tebe
měl otázeku: V tvém příkladu používáš v Repository abstract class,
já mám pouze class. Vadí to něčemu? Protože pokud použiji abstract class,
tak mi laděnka hlásí problém, že nemůže službu nalézt –
předpokládám špatně nalinkované do configu? Mám to způsobem:
services:
- App\Model\BaseManager
- David Matějka
- Moderator | 6445
V configu musis jako sluzby registrovat ty konkretni tridy, ktere od BaseManageru dedi
- Neo-Mike
- Člen | 22
Mám tam jak BaseManager, tak další služby, které dědí od něj. MachineManager dedi od Basemanageru. UserManager je ze Sandboxu.
services:
- App\Model\UserManager
- App\Model\BaseManager
- App\Model\MachineManager
Ale jak napíšu místo class abstract class, tak mám v laděnce tohle:
Class App\Model\BaseManager used in service '39_App_Model_BaseManager' not found or is not instantiable.
Editoval Neo-Mike (4. 4. 2016 11:59)
- David Matějka
- Moderator | 6445
Ano, je to kvuli tomu, ze je to abstraktni. V configu mas registrovat pouze tridy, ktere muzes inicializovat.
- Šaman
- Člen | 2665
To jsou základy OOP.
Převedeno na profláklý příklad se zvířátkama :)
Abstraktní třída je Zvire
. Od ní může dědit třeba další
abstraktní Savec
, který doplní charakteristické rysy
savců.
Ale když plníš klece v zoo (ten seznam v configu je podobný třeba
inventáři v zoo), tak tam nemáš obecná zvířata, ani savce, ale
konkrétně Zubr
, Medved
, Velbloud
…
A ty jsi tam navíc chtěl ještě do jedné klece umístit zvíře
Savec
. A takové zvíře neexistuje. A aby se pojistilo, že
nemůžeš z takovéto třídy vytvářet konkrétní instance, tak je
označená jako abstraktní (určená pouze k dědění).
(Ty jsi tu instanci BaseManager sice vytvořil, ale nikde nepoužil. Jinak by to
haprovalo. A po označení abstract
už ti to nahlásí chybu už
během vytváření…)