Projekt

Obecné

Profil

Požadavek #951

Aktualizováno uživatelem Ondřej Fibich před více než 9 roky(ů)

h2. Analýza a současný stav 

 Servisní vrstva bude obsahovat business funkcionalitu FreenetISu jejíž složitost znemožňuje, aby byla implementována v rámci doménového objektu (modelu s návrhovým vzorem "active record":http://en.wikipedia.org/wiki/Active_record_pattern) nebo se dotýká více doménových objektů a ze své podstaty není vhodné ji zahrnovat v řadiči (controlleru), jelikož ten by měl pouze v interagovat s uživatelem. 

 Typicky se jedná např. o funkcionalitu stržení čl. příspěvků, která je implementována jako statická metoda řadiče a tím pádem zamíchána kódu s UI. Navíc statické volání této metody z jiného řadiče je architektonická prasárna. Pokud se to takto používá je nutné načítat mnohdy ne zrovna malou třídu řadiče kvůli jedné funkci (při jednom požadavku na aplikaci by se měl vždy použít pouze jeden řadič což v současném stavu není mnohdy pravda). 

 h2. Návrh 

 Vznikne nová složka @/application/services@, která bude obsahovat třídy reprezentují jednotlivé services. Vnitřní hierarchie adresářů bude odpovídat použítým PHP namespace. Každá service třída sdružuje funkcionalitu z jedné oblasti a měla by být bezstavová (mezi voláními svých metod neuchovává žádný stav). Výjimkou bezstavovosti je kešování, které tato vrstva může efektivně spravovat. 

 Service třída musí implementovat rozhraní @IService@, které definuje přístup k továrně pro získání závislých services. 

 Jednotlivé services nepůjde získat jinak než pomocí třídy @ServiceFactory@, která bude dostupná z skrze proměnnou každého řadiče @services@. 
 Třída @ServiceFactory@ bude metody pro vytvoření všech dostupných service (nepoužije se něco jako @ORM#factory@, protože pak by nešlo používat našeptávání v IDE). Metody budou pojmenovány následovně: @inject<JmenoService>@ 
 Vnitřní implementace service továrny bude vytvářet singleton instance jednotlivých service tříd (toto chování půjde v budoucnu snadno upravit). 
 Továrna je nutná kvůli prozatimnímu přemostění, nekompatibility Kohany s PHP namespaces a zároveň umožňuje optimalizovat tvorbu a přidělování service instancí. 

 Závislosti mezi řadiči, modely, helpery a services bude následující: 

 <pre> 
 [Controller A] --> [Service X] --> [Model H] 
                                --> [Model F] 
                                --> [Helper J] 
                                --> [Service F] 
                --> [Service Y] 
                --> [Model G] 
                --> [Helper Q] 
 </pre> 

 Řadič je tedy na jeden požadavek vždy pouze jeden. Každý řadič může používat vícero služeb, modelů, helperů a pohledů pro obsluhu jednoho požadavku. Service může používat helpery, modely a jiné services. 


Zpět