Autor Zpráva
Martin02
Profil
Ahoj,

nikdy jsem nepoužíval MVC, až na pár úprav v Prestashopu, a teď budu dělat jakýsi administrační systém využívající Nette fw. Není mi jasná jedna věc ohledně modelu. V Prestashopu jsem viděl techniku, že pro každou věc (produkt, kategorie produktů, stránka, uživatel...) existovala třída v modelu, která obsahovala všechny informace o dané věci (v podobě vlastností třídy; ty se v konstruktoru načítaly z databáze) plus nějaké funkce (metody) související s danou věcí. Takže je například třída User, která má vlastnosti jméno, příjmení, login, email... a metody například login(), logout(), isLoggedIn() atd.

Když jsem četl v dokumentaci Nette fw vytváření ukázkové aplikace, tak se tam nic takového nepoužívalo. Místo toho se v presenterech data hledala přímo v databázi.

Chci se tedy zeptat, co z toho je lepší?


Děkuji
Alphard
Profil
Můžete uvést odkaz na dokumentaci Nette, kde jste to viděl? Teď se dívám, že popisované konstrukce obsahuje QuickStart, ten je ale třeba chápat jen jako seznámení se s frameworkem, je tam kladen důraz na jiné věci. Příklady nejsou komplikovány samostatným modelem.

V praxi samozřejmě tyto věci jsou v modelu, a to často v několikavrstevném.
Martin02
Profil
Ano, měl na mysli právě ten Quickstart. Usuzuji tedy, že se tato technika běžné používá. Děkuji!

Mimochodem, co znamená zmíněný "několilavrstevný model"?
juriad
Profil
http://www.phpguru.cz/clanky/pet-vrstev-modelu
Alphard
Profil
Viz např. PHP Guru » Pět vrstev modelu nebo se podívat na Architektura aplikace nad Doctrine 2. Ani jedno prosím nechápat dogmaticky, spíš přemýšlet o principu.

Obecně s komplexností aplikace může růst potřeba přidávat do modelu další vrstvy. Ten úvodní nástřel, že jedna entita je vždy popsaná právě jednou třídou taky není vždy ideální.
Martin02
Profil
Tak to už je na mě nějaké složité. Ale rád bych to na svém webu uplatnil...

Jestli to chápu dobře... Mám nějaký kontroler (v mém případě "definovaný" Nette frameworkem). V něm chci dejme tomu vypsat prvních 5 článků. Takže tento požadavek předám repozitáři ArticleRepository. Ten vytvoří instanci mapperu ArticleDbMapper, který sáhne do db, najde data, udělá z nich entitu ArticleEntity. Tuto entitu vrátí repozitáři, který si o ni zažádal a ten ji zase vrátí kontroleru, který z ní vypisuje data atd.

V odkazovaném článku je uvedeno $article = $articleRepository->find(123);. To je myšleno tak, že v $article po provedení kódu bude entina ArticleEntity? Předpokládám, že ano. Co ale nechápu je, jak mohu teď volat settery na tuto entitu? Vždyť (jak je popsáno v článku) entita je jen "přepravka" na data. To se ten požadavek na akci (například editace článku) zase nějak předá příslušnému repozitáři a ten zase příslušnému mapperu, který pošle příkaz do db?

Přijde mi to takové divné, že když chci jen získat data, tak jde způsobem kontroler -> repozitář -> mapper -> entita. Ale při (například) editaci to jde jinou cestou.


Snad je alespoň trochu pochopitelné, co nechápu... :)



Děkuji za odpovědi!
juriad
Profil
Martin02:
Setter normálně v entitě je. Přesunuly se jen metody find a save do repozitory (a mapperů).

Takže:
$article = $articleRepository->find(123);
$article->setAuthor('Pepa');
$articleRepository->save($article);
Martin02
Profil
juriad:
Už to asi chápu. Díky moc!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: