Doctrine nebo jiné ORM které se spojí s Nette tak snadno jako Symphony

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

Ahoj,

hledám něco, jako má Symphony a Doctrine2 – tedy pěkně v konzoli dám generate entity, zadám položky a mám entitu, manager. Na další kliknutí se vygenerují formuláře, presentery, routy atd.

Nepotřebuji všechno, ale nějak snadno nahodit ORM by potěšilo, nastavit vazby mezi entitami a podobně. Máte něco takového pro Nette? :-)

Díky

Šaman
Člen | 2666
+
0
-

Pokud vím tak ne. Nette je PHP framework s podporou dotazování do db, Doctrine 2 je ORM framework, který samozřejmě můžeš používat i v Nette. Když pohledáš na fóru, tak zjistíš že někteří programátoři to tak používají a dokonce kdysi někde nasdíleli ukázkové řešení (tuším že na Nette + Doctrine2 jede Medio).

SvvimX
Člen | 65
+
0
-

To je škoda, chápu co je co a že to jde používat, jen symphony má v consoli easy možnost jak si nechat věci vygenerovat. Škoda

enumag
Člen | 2118
+
0
-

Buď si napiš generátory pro Nette anebo používej Symfony když ti vyhovuje. :-)

Filip Procházka
Moderator | 4668
+
0
-

Nette považuje před-generování kódu (presentery, modely, …) za odpornou praktiku. Pokud můžeš kód vygenerovat, tak stejně dobře ho nemusíš generovat vůbec, ale raději ho dekomponovat a používat na více místech čistě, bez duplicit.

Na to, abys mohl vytvořit prázdnou třídu presenteru nepotřebuješ generátor – na to ti stačí jednoduchá šablona v tvém IDE.

Michal Vyšinský
Člen | 608
+
0
-

Zdravím,
dovolím si odkázat na vlastní třídu Connection, kterou používám ve svém Cms. Funguje to tak, že se na developement modu automaticky generují tabulky z php entit. Ve svém Cms to mám jako extension takže jsou tam další konfigurační hodnoty.

SvvimX
Člen | 65
+
0
-

@enumag zatím nevím co mi vyhovuje, hledám něco ideálního :-)
@Filip Procházka jop, na šablonu presenteru stačí šablona IDE, ale symphony na základě údajů o sloupcích v DB generuje php entitu s doctrine notací (prostě ty doctrine komentáře), v presenterech dělá rovnou akce edit, delete, generuje formuláře pro přidávání záznamů a podobně, na to už IDE nestačí. Nevím jestli to je odporná praktika, ale uplně stupidní stránka se tím vytovří za 3 minuty. Přišlo mi to pěkné.

Co používáte vy (je mi jasné že Nette)? Myslím jako DB framework a vubec tak koncepci aplikací?

Zkoušel jsem si hrát s DAO objekty a factories, taková jakási Java syntaxe. Aplikace vypadá přenositelně, robustně a dá se v ní vyznat. Ale nesedí mi v tom Nette Database, v podstatě notORM.

enumag
Člen | 2118
+
0
-

Poslední dobou se dost rozjíždí pokusy o nějaké ORM nad Nette\Database, např. YetOrm. Dále existuje Ndab, Fabik\Database a asi i další. Z uvedených jsem zkoušel všechny, nejsou špatné, ale drobnosti co by šly vylepšit jsem našel u každého. Ještě jsem bohužel neměl moc čas to řešit.

Kromě Nette\Database se s Nette běžně používá samozřejmě Doctrine 2 a dibi (což také není ORM). K obojímu jsou addony nebo nějaké návody, to už najdeš. ;-)

Pokud jde o architekturu aplikace, doporučuji přečíst a hlavně pochopit tento článek (i pokud neplánuješ používat Doctrine).

llook
Člen | 407
+
0
-

Obecně, pokud řešením nějakého problému je udělat 10× copy&paste s nějakou drobnou změnou (nic jiného ty generátory nedělají), tak ten problém lze také zobecnit tak, aby nic takového nebylo potřeba. Mimo jiné to má své výhody při následném zavádění hromadných změn.

Například generování formulářů podle definice entity. To přece lze dělat on-the-fly (jednoduchý příklad) a když budeš chtít v budoucnu změnit výchozí prvek pro nějaký typ, tak to změníš na jednom místě. Zatímco když budeš mít balík předgenerovaných formů smíchaných s vlastními úpravami, tak budeš muset všechny upravovat ručně a to je vopruz.

Filip Procházka
Moderator | 4668
+
0
-

SvvimX napsal(a):

@Filip Procházka jop, na šablonu presenteru stačí šablona IDE, ale symphony na základě údajů o sloupcích v DB generuje php entitu s doctrine notací (prostě ty doctrine komentáře),

To nedělá Symfony, ale přímo Doctrine – a umí to i naopak.

v presenterech dělá rovnou akce edit, delete, generuje formuláře pro přidávání záznamů a podobně, na to už IDE nestačí. Nevím jestli to je odporná praktika, ale uplně stupidní stránka se tím vytovří za 3 minuty. Přišlo mi to pěkné.

Na takový boilerplate napíšeš CRUD, který bude umět všechno, aniž bys generoval kód a můžeš ho znovupoužít jak chceš. Jenom je škoda, že ty co jsou napsané, tak nejsou úplně veřejné :(

Co používáte vy (je mi jasné že Nette)? Myslím jako DB framework a vubec tak koncepci aplikací?

Já používám Doctrine a píšu si vlastní integraci do Nette (ale bohužel k tomu ještě není docka a není to na 100% hotové, takže použití na vlastní riziko).

SvvimX
Člen | 65
+
0
-

@enumag díky za link, prostuduji, vypadá to, že v tom najdu své odpovědi
@llook neříkám, že nejsou lepší jiné postupy, jen se mi celkem líbila možnost nechat si pár věcí vygenerovat a poupravit a použít.

Aktuálně sem (první projekt v Nette) udělal toto

CDatabaseDAOFactory
 – singleton, od Nette dostane v konstruktoru Nette\Database\Connection

pro každou entitu (např stránka)

CPage
 – entita
 – gettry, místo setterů dostane data jako asociativní pole v konstruktoru

IPageDAO
 – interface, každý DAO objekt ho musí implementovat

CPageDatabaseDAO
 – implementuje IPageDAO
 – v konstruktoru dostane Nette\Database\Connection
 – jako členskou proměnnou má public static $m_Columns – sloupečky databáze (aby se daly měnit názvy)
-! pracuje pouze s tabulkou page
 – získám ho voláním CDatabaseDAOFactory::getInstance () → getPageDAO
 – implementuje metody jako getById za použití NetteDatabase

CPageManager
 – třída obsahující pouze statické metody
 – např public static function getAllPages – volá nad CPageDatabaseDAO metodu getAll

PagePresenter
 – presenter volá metody z CPageManager, který mu vrací pole objektů CPage

Dle mě to není uplně špatně, neboť se jednoduše může vyměnit databázová vrstva – napíší se nové DAO třídy a CDatabaseDAOFactory (se změni např na CxmlDAOFactor) a bude vracet správné DAO třídy

Aplikace zůstává nedotčena.

Problém u mě nastal, jak vyřešit když chci zákazníka a všechny jeho objednávky v eshopu. Jestli volat
CUserManager::getBy ( $id )
a potom COrderManager::get …
Nebo udělat nějaký další Manager, který by todle dělal?
Dále musí moje managery umožnovat selecty s různými podmínkami, tedy v podstatě musí umět totéž co NetteDatabase (např LIKE, limit, offset, where and, or, where in …)

V tomto bodě mám něco špatně navrženo :) ale nepřišel jsem na to jak to udělat, abych měl stále oddělenou aplikaci od DB vrstvy, aby šlo jednoduše změnit Mysql na postgress nebo xml nebo cokoliv (přepsáním DAO tříd) atd.

Pokud je odpověď v článku od enumaga, pak ji tam jistě najdu :) kdyby ne, tak děkuji za další rady..

Edit: dočetl jsem článek a můžu říct, v podstatě to je podobné. Entitu mám prostupuje celou aplikací až do view. Repository je vlastně ten DAO objekt, vrací ho něco z Doctrine, mě můj vlastní singleton. Entity manager ani service asi nemám a Můj manager mi vlastně dělá něco jako Facade.
Problém u mě byl, že jsem musel pomocí nette database psát dotazy nad tabulkami a chtěl jsem mít co DAO to tabulka v DB. To mi Doctrine vyřeší sám, neb díky anotaci si tabulky sám prováže.
Závěrem, asi vezmu Doctrine a vyzkouším jak se mi to s ním povede. → Ještě tu založím pár témat :-)

Editoval SvvimX (15. 2. 2013 1:21)