Doctrine nebo jiné ORM které se spojí s Nette tak snadno jako Symphony
- SvvimX
- Člen | 65
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
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).
- Filip Procházka
- Moderator | 4668
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
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
@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
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
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
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
@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)