Aplikační služby

Zatím co garanty služeb a továrny jsou použity primárně pro služby samotného frameworku, tak aplikační služby (jak název napovídá) je ukázka možné implementace DI v rámci aplikace a v ukázkové aplikaci praktické využití najdete.

Základní myšlenka je ta, že aplikace postavená na PHP Jet by měla být tvořena aplikačními moduly. Modul netvoří jen dílčí část aplikace, ale zároveň může sloužit jako služba systému, nebo ostatním modulům.

Pojďme se podívat na dva příklady.

První příklad: autentizační a autorizační kontroler

První příklad je autentizační a autorizační kontroler systému autentizace a autorizace. Jedná se o službu, která musí implementovat rozhraní Jet\Auth_Controller_Interface. Touto službou může být jakákoliv třída, ale lepší je autorizační subsystém vytvořit jako aplikační modul, který je snadno zaměnitelný, přenositelný mezi projekty a znovupoužitelný. A přesně tak je to udělané v ukázkové aplikaci. Koukněte se například na modul Admin.Auth.Controller a jeho hlavní třídu Main: namespace JetApplicationModule\Admin\Auth\Controller;

class 
Main extends Application_Module implements Application_Admin_Services_Auth_Controller
{
    protected 
Administrator|false|null $current_user null;
    

    public function 
checkCurrentUser(): bool
    
{
        
        ...    
    }
    
    public function 
getCurrentUser(): Administrator|false
    
{
        ...    
    }
    
    public function 
handleLogin(): void
    
{
        ...    
    }

    public function 
logout(): void
    
{
        ...    
    }
    
    public function 
loginstring $usernamestring $password ): bool
    
{
        ...    
    }
    
    
    public function 
loginUserAuth_User_Interface $user ) : bool
    
{
        ...
    }
    
    public function 
getCurrentUserHasPrivilegestring $privilegemixed $value=null ): bool
    
{
        ...
    }
    
    public function 
checkModuleActionAccessstring $module_namestring $action ): bool
    
{
        ...
    }
    
    public function 
checkPageAccessMVC_Page_Interface $page ): bool
    
{
        ...
    }

}

Zde je implementována služba, která má na starosti hlídat přihlášení uživatele a jeho oprávnění. Kromě tohoto modulu však v ukázkové aplikaci najdete i moduly Web.Auth.Controller a REST.Auth.Controller, které dělají totéž, ale v souvislosti s přihlášením na web, nebo k REST serveru. Tedy s úplně jinou entitou představující uživatele a role a s využitím jiných postupů přihlášení. Tedy tři odlišné implementace téže systémové služby.

Služby tedy máme. Teď je nutné říct systému kterou z těch služeb má použít. V ukázkové aplikaci se to řeší v inicializátorech báze. Tedy například v metodě Application_Web::init( MVC_Router $router ): void naleznete tento kus kódu:

Auth::setControllerProvider( function() : Application_Web_Services_Auth_Controller {
    return 
Application_Web_Services::AuthController();
} );

Poznámka:V tomto konkrétním případě se služba neinicializuje ihned, ale až když opravdu nějaká část aplikace potřebuje autentizaci a autorizaci uživatele. (důvod: výkon, neustála inicializace čehokoliv zbytečného = pokles rychlosti aplikace). Tedy do garanta služby se zde nevkládá rovnou instance služby, ale anonymní funkce, která se zavolá v případě skutečné potřeby použití služby a která službu vytvoří.

Jak vidíte, tak samotná inicializace služby probíhá takto:

return Application_Web_Services::AuthController();

Tedy není inicializován žádný konkrétní modul, ale je použit subsystém aplikačních služeb, který ma za úkol vyhledat apliklační modul, který poskytuje danou službu. Jak přesně proběhne vyhledání služby si povíme později.

Nyní se podíváme ještě na jeden příklad, který není tolik systémový a je o komunikaci přímo mezi aplikačními moduly.

Druhý příklad: Obrázková galerie

Součástí ukázkové aplikace je minimalistické primitivní CMS, jehož úkolem je pouze ukázat principy vývoje v PHP Jet. Toto CMS pracuje pouze s obrázkovými galeriemi a články. Entita článek může mít úvodní obrázky. A pro účel demonstrace jsou obrázky spravovány moduly obrázkové galerie. Tedy moduly článků se o obrázky nestarají, řeší pouze textový obsah a pro práci s obrázky využívají služeb jiných modulů. Je to naprosto ideální a nutná cesta jak stavět velké aplikace. Pojďme si to ukázat prakticky.

Předchozí kapitola
Jet\Factory_Config
Další kapitola
Generování uživatelského rozhraní