Práce se základním modelem

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

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?

Šaman
Člen | 2665
+
0
-

Tohle se nedávno řešilo tady.
Ukázka velmi primitivního základu modelu v Nette\Database\Table je na githubu.
Rozhodně model není dělaný pro jednotlivé presentery, naopak presentační vrstva a vrstva modelu mají být co nejvíc nezávislé.

Editoval Šaman (3. 4. 2016 17:05)

Neo-Mike
Člen | 22
+
0
-

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

V configu musis jako sluzby registrovat ty konkretni tridy, ktere od BaseManageru dedi

Neo-Mike
Člen | 22
+
0
-

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

base manager smaz z configu

Neo-Mike
Člen | 22
+
0
-

Paráda, díky už to funguje :). Můžu tě požádat ještě o vysvětlení, proč BaseManager nemá být v configu uvedený? Je to kvůli tomu, že se jedná o abstraktní třídu?

David Matějka
Moderator | 6445
+
0
-

Ano, je to kvuli tomu, ze je to abstraktni. V configu mas registrovat pouze tridy, ktere muzes inicializovat.

Šaman
Člen | 2665
+
+3
-

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í…)

Neo-Mike
Člen | 22
+
0
-

Díky všem za rady :)
Šaman: parádní vysvětlení, to byla hračka pochopit už :)