řešení – Seznam uživatelů na více místech

martin_H
Člen | 32
+
0
-

Jak se řeší následující věc. Mám v aplikaci na více místech seznam uživatelů. Jak vyřešit abych nemusel v každém modelu a presenteru sosat data z DB?
V klasickém PHP bych si udělal soubor, který bych includoval na potřebných místech, ale nevím jak toto řeší Nette.

MajklNajt
Člen | 471
+
0
-

môžeš to riešiť napr. tak, že si v modeli vytiahneš dáta, uložíš si ich do property a pri ďalšej požiadavke na dáta už nebudeš siahať do DB, ale pošleš obsah tej property…

Kamil Valenta
Člen | 758
+
0
-

Pokud bys v php udělal soubor a includoval na více místech, stejně bys do DB sahal vícekrát.
Pokud chceš vícekrát něco zobrazit (ve více presenterech), udělej si na to komponentu s gridem a tu jen opakovaně vykreslíš.

Pokud ale chceš ušetřit sahání do DB, tak si datasource toho gridu zacachuj.

martin_H
Člen | 32
+
0
-

kamil_v napsal(a):

Pokud bys v php udělal soubor a includoval na více místech, stejně bys do DB sahal vícekrát.
Pokud chceš vícekrát něco zobrazit (ve více presenterech), udělej si na to komponentu s gridem a tu jen opakovaně vykreslíš.

Pokud ale chceš ušetřit sahání do DB, tak si datasource toho gridu zacachuj.

ale tu komponentu pak musím znovu vytvářet v každém presenteru ne?

Gappa
Nette Blogger | 199
+
+2
-

martin_H napsal(a):

kamil_v napsal(a):

Pokud bys v php udělal soubor a includoval na více místech, stejně bys do DB sahal vícekrát.
Pokud chceš vícekrát něco zobrazit (ve více presenterech), udělej si na to komponentu s gridem a tu jen opakovaně vykreslíš.

Pokud ale chceš ušetřit sahání do DB, tak si datasource toho gridu zacachuj.

ale tu komponentu pak musím znovu vytvářet v každém presenteru ne?

Pokud máš nějaký BasePresenter, pak metodu createComponentUserList můžeš mít jen tam.

Šaman
Člen | 2634
+
+1
-

O co ti jde? Opravdu o snížení počtu dotazů do db? Většinou to nebývá problém, ale pokud opravdu chceš, pomůže jen cachování.

Jde ti o to nepsat stejný kód vícekrát? Napiš si třídu (která spadá do modelu) a případně i komponentu, která data rovnou zobrazí. Vícekrát pak budeš volat jen továrnu, která ti vrátí už připravenou komponentu.

Nastuduj si továrničky a DIC. Obojí má Nette pěkně vyřešené.

Editoval Šaman (24. 2. 2020 13:06)

martin_H
Člen | 32
+
0
-

Šaman napsal(a):

O co ti jde? Opravdu o snížení počtu dotazů do db? Většinou to nebývá problém, ale pokud opravdu chceš, pomůže jen cachování.

Jde ti o to nepsat stejny kód vícekrát? Napiš si třídu (která spadá do modelu) a případně i komponentum která data rovnou zobrazí. Vícekrát pak budeš volat jen továrnu, která ti vrátí už připravenou komponentu.

Nastuduj si továrničky a DIC. Obojí má Nette pěkně vyřešené.

o počet dotazů nejde, asi jsem to špatně popsal.

Nastuduji , to bude asi ono… Díky

Šaman
Člen | 2634
+
+2
-

Tak v tom případě:

  • Includování zařídí Nette (RobotLoader, nebo Composer Autoloader). Na pozadí stále includování probíhá.
  • Uvažuj ale objektově. Nepíšeš script (soubor), píšeš třídu.
  • Tu třídu si pak můžeš vytvořit kdekoliv.
  • Můžeš použít new UserModel($dbConnection);, ale tento způsob má mnoho nevýhod.
  • DIC – Dependency Injection Container třídu vytvoři i s jejími závislostmi, třeba databází
  • Takže je lepší si tu třídu zaregistrovat v configu (pak ji vytvoři a nakonfiguruje závislosti Nette na pozadí)
  • A potom si ji jen vyžádat

Editoval Šaman (24. 2. 2020 13:25)