Nápad na použití fluent DIBI v modelu
- Jadro007
- Člen | 8
Ahoj všichni,
trochu jsem si hrál s fluent DIBI a napadla mě jedna taková menší
vychytávka, možná to někoho z vás zaujme nebo mě přesvědčíte, že je
to naprostá blbost :-)
Nejde o nic převratného, ale už k věci – na fluent DIBI se mi hodně líbí možnost vytvoření SQL factory, tedy funkce, která vrátí fluent DIBI, které lze dále upravovat. A napadlo mě, že bych mohl mít všechny funkce modelů vytvořené tak, aby vraceli fluent DIBI – takže jedna funkce může použít SQL jiné funkce, třeba funkce getCars si může spustit funkci getAll a pak jenom přidat
->setWhere("isCar = TRUE")
Na tomto řešní se mi nelíbila jedna věc a to když si v presenteru zavolám třeba
$this->vehicles->getCars()
, tak se mi vrátí fluent DIBI – jenže v presenteru fluent DIBI nemá moc co dělat a radši bych tam viděl data.. nebo byla možnost volat třeba
$this->vehicles->getCars()->fetchAll()
, ale nemám rád zbytečné psaní a tak jsem přemýšlel co s tím..
Přišel jsem podle mě na celkem elegantní řešní – z presenteru nebudu volat ->getCars(), ale
->loadCars()
, která bude vracet přímo data. Abych nemusel ručně vytvářet pro každou get funkci alternativní load, tak jsem si pohrál s magickou funkcí call, takže vše se děje naprosto automaticky bez nutnosti psát duplicitní funkce.
Kromě toho magiciky funguje
getCarsCount()
, tedy funkce, která upraví DIBI fluent v getCars() a vrátí efektivně počet záznamů.
Mimo to jsem ještě v praxi zjistil, že poměrně často používám LIMIT (stránkování atd.), takže jsem se rozhodl zprovozni zápis *
$this->vehicles->setLimit(100, 20)->loadCars()
, protože se mi nelíbí předávání LIMITu přes parametry funkce loadCars(), kde může být něco užitečnějšího vztažené přímo k dané funkci.
Editoval Jadro007 (11. 8. 2013 11:14)
- mkoubik
- Člen | 728
Nápad je to rozhodně dobrý a vsadím se že něco takového používá
spousta lidí. Od tohohle řešení je už jen krůček k použití
specification patternu, který ti umožní zbavit se záplavy metod
typu getUnusedCarsOrderedByColor()
. Doporučuju si pročíst: http://www.whitewashing.de/…itories.html (ukázky jsou sice
pro Doctrine 2, ale celkem jednoduše si můžeš místo
Doctrine\ORM\QueryBuilder
domyslet DibiFluent
).