Diskuze: PHP: Rozdělení modelu do vrstev
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 8 zpráv z 8.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Model by měl být jen jeden. Můžeš ho však dědit a přidat mu vždy tu část datové struktury, kterou potřebuješ navíc. Správa více uživatelů v jedné instanci by neměla být problém, dokud nepoužiješ ORM. Pak už to problém je.
Volbu úložiště provádím ve chvíli, kdy vytvářím instanci modelu, resp. konstruktoru modelu předám jako parametr handler otevřeného databázového objektu.
V tomhle případě model bude jen jeden. On vlastně komunikuje jen se servisem, který mu vrací nějaké další instance tříd. V podstatě je to ale jeden model, jen rozdělený do víc vrstev.
Mně přijde totiž dost nelogické pracovat např. ve třídě User s více uživateli nebo že by třída Users reprezentovala jednoho uživatele, to taky nevidím jako dobrý nápad. Navíc ne vždy budu chtít vrátit ten samý DTO. Pro některé to bude třeba Kniha, pro další úplně jiná entita.
V Rails jsem toto řešil tak, že User obsahoval instanční metody pro
práci s jedním uživatelem a třídní metody pro práci s více uživateli. V
.NET se tento způsob často používá. Na devbooku nemáme ORM, mám tam tedy
UserManager, do kterého cpu obojí instančně 
Stále mi tam nějak nesedí, že je to všechno v objektu User. User by měl reprezentovat jen jednoho uživatele. Takhle to porušuje Single Responsibility Principe (http://www.zdrojak.cz/…ncipy-solid/ - dál jen SRP). Na Rails jsem teď slyšel kritiku kvůli tomu, že neobsahuje DI, ale to je na jiné povídání.
Ten UserManager se mi ale celkem líbí. To máš jako takové spojení některých těch vrstev, co popisuji výše, ne? Resp. komunikuješ s uložištěm (databází), navenek nabízíš jasně dané rozhraní a vracíš instance User. Problém by ale nastal, kdybych chtěl třeba změnit uložiště za něco jiného než je databáze v průběhu aplikace (třeba Cache). To pak nemůžu jednoduše předat jinou instanci. Musel bych to v UserManageru zjišťovat a to je pak zodpovědný jak za manipulaci s uživateli, tak i za zjišťování, odkud je má brát, což porušuje SRP. Je jasné, že pro uživatele bych to asi nepotřeboval, ber to spíš obecně.
Ono strašně záleží na názoru, Rails třeba míchá GET a POST do jednoho pole. Je to špatně? Je to dobře? .NET je zas plný statiky a funguje to perfektně. Já myslím, že ten návrh je sice velmi důležitý, ale také velmi přeceňovaný.
Na devbooku nemáme ORM, nevracím tedy žádné instance, místo toho vracím jen pole s nějakými daty, co funkce vytahá z DB, případně ještě nějak předpracuje.
Osobně bych hodil statiku na třídu User, tak by dávalo smysl, že jsou metody pro více uživatelů a zároveň by vše bylo na třídě User. Záleží na tom, kolik těch metod je. Ty se asi ptáš na to, kam to rozšiřovat dál, to také nevím, kdyby to bylo dlouhé, založil bych si ještě UserManager.
Já v tomhle hlavně nejsem moc dobrý a ani neuznávám příliš
komplikované vzory, beru vše s rezervou, protože jinak by se z toho člověk
zbláznil
Občas, když vidím
cizí kód, tak si říkám... však to znáš 
Máš pravdu, asi to moc řeším, jen si nechci uprostřed vývoje uvědomit, že to dělám špatně a že to takhle nebude fungovat. Pro každý controller mám jeden model, takže snad bude stačit použít Nette\Database v jeho metodách pro úpravu databáze. ORM se mi zdá pro moje účely dost zdlouhavé. Máte s jeho implementací zkušenosti (třeba Doctrine 2) nebo bych ORM používat neměl?
Každopádně díky za vaše názory, dost mi to pomohlo 
Já mám k ORM neutrální vztah, když ho někde dostanu odladěné, použiji ho, když ne, vyhnu se mu. Co jsem slyšel, tak Doctrine není úplně nejjednodušší, ale nikdy jsem s tím nedělal.
Jestli bys měl nebo neměl používat ORM je otázka pro tebe, je to prostě jeden z přístupů, který má své výhody a nevýhody. ORM se běžně používá v hotových řešeních (Rails, ASP), ale víme, že PHP nic takového nenabízí a naopak existují mraky různých řešení třetí strany. Proto já v PHP ORM nepoužívám, ale třeba bych byl překvapen, že funguje dobře. Dokud budeme pracovat s relační databází, bude to stále kontroverzní téma.
Zobrazeno 8 zpráv z 8.