Mezivrstva mezi entitami a view

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

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
+
+1
-

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
+
0
-

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
+
0
-

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 ;-)