Mezivrstva mezi entitami a view
- rosta95
- Člen | 2
Ahoj, začínám s Nette a k tomu s Doctrine, tak se předem omlouvám zda
můj dotaz bude špatně položen.
Aplikaci jsem rozjel, napsal jsem si pár modelů, entity a všechno krásně
funguje – možná až moc krásně a rychle :)
Teďka jsem ale narazil na, myslím, návrhový problém. Respektivě nevím jak něco optimálně implementovat.
Mám napsaný servisní třidy pro otevírací dobu které mi pracují
s časy z databáze a pomáhají při generování.
Obsahují metody jako isNowOpen()
, isBreak()
atd.
Tyhle třídy potřebují časy, které jsou v databázi u jednotlivých poboček, takže jsem to teďka implementoval do jedné funkce v entitě.
class Branch {
public function getOpeningTimes() {
return new OpeningTimeService($this->times);
}
}
Což v pořádku funguje. Kdekoliv pracuju s entitou Branch tak si můžu
zavolat $branch->getOpeningTimes()->isNowOpen()
a ikdyž se
mi to nezdá jako optimální implementace (v entitě) tak s tím žiju.
Nicméně jsem teďka do otevíracích dob přidal možnosti státních svátků
a různých vyjímek takže jsem servisu rozšířil:
class Branch {
public function getOpeningTimes() {
$openingTimes = new OpeningTimeService($this->times);
$openingTimes->setHolidays($this->holidays);
$openingTimes->setExceptions($this->exceptions);
return $openingTimes;
}
}
Tady už nastává problém kdy se na každou entitu pořád volají
$this->holidays
což jsou zbytečné dotazy a nic to
nepřináší.
V případě kdy bych chtěl výstup cachovat, tak mi nepřijde ok to dělat ve
třídě entity.
Takže řeším jak správně spojit entitu s otevrací dobou.
Říkal jsem si že třeba v modelu/presenteru udělat nějaký connect model který by to spojil nebo něco podobného. Tam bych musel ale zase každý výstup iterovat a connectnout s otevírací dobou. Akorát netuším jak ideálně na to, nebo jak to optimálně pojmenovávat pro google atd. Už se v tom sám motám.
Snad jsem to vysvětlil nějak srozumitelně, děkuji za příadné reakce.
Rosťa
- CZechBoY
- Člen | 3608
Lepsi by bylo mit sluzbu na zjisteni oteviraci doby. Timhle zpusobem by
entita musela umet x veci a nebylo by to v 90% vse potrebne.
Tu tvoji OpeningTimeServise prepis tak, ze pro zjisteni oteviraci doby ji predas
pro jakou entitu chces oteviraci dobu. Takze ta sluzba si jednou nacte co
potrebuje (konstruktor) a dal uz jen resi danou entitu.
Asi bych to zavrel cele do samostatne komponenty, v konstruktoru predas entitu,
sluzba se autowirne, takze se nemusis o nic moc starat.
- rosta95
- Člen | 2
To zní celkem zajímavě, řešilo by to propojování a další. Akorát si nedovedu představit, jak k tomu přistupovat v rámci výpisu kde třeba iteruju jednotlivé entity v šabloně. Nebo jak to donarvat do API kterou vytvářím skrze serializer? Asi pověsím programování na haček a půjdu dělat třeba do pekárny :-D
- CZechBoY
- Člen | 3608
V nějakém tabulkovém výpisu/seznamu asi nechceš vypisovat plnou dobu,
ne? Maximálně tak v nějakém tooltipu/popupu. Potom bych doporučil
zkouknout Multiplier.
Api a serializer – přesně nevim jak to máš řešené, takže buď ukázka
nebo více textu pro konkrétní radu ;-)