Mikrorouter kontroleru

Jak již víte, tak mikrorouter kontroleru je třída Jet\MVC_Controller_Router, která má být nápomocná k dořešení požadavku, tedy implementaci rozhodovací logiky metody resolv(). Připomeňme, že určením této metody je dořešit o jaký požadavek se jedná a jaká akce kontroleru bude ve finále prováděna. Tedy tato metoda může zpracovávat nezpracovanou část URL, GET parametry a případně další aspekty.

Pojďme na to kouknout zcela konkrétně a jako příklad si vezmeme jednoduchou situaci.

V ukázkové aplikaci je aplikační modul Content.Articles.Browser. Jak název napovídá, tak modul slouží k procházení a čtení článků. Tento aplikační modul je jako obsah umístěn na jedné ze stránek a musí umět zobrazit seznam článků a to s ohledem na stránkování s tím, že každá stránka seznamu má svou URL. Pokud uživatel / návštěvník na nějaký článek v seznamu kliknete, tak se musí dostat na stránku mající opět specifickou URL, kde najde detail článku. Máme tu tedy dvě akce kontroleru list a detail a ty jsou rozlišené URL adresou.

Jak zjistit, která akce kontroleru se má zavolat na základě URL? Tedy na co uživatel právě kouká a co tedy přesně má modul provést? U tom si už musí kontroler rozhodnout sám a slouží k tomu metoda resolv()

Tedy jde o implementaci nějaké rozhodovací logiky. A tato logika může být někdy triviální, ale někdy řekněme "zašmodrchanější". Ovšem v praxi se ukázalo, že je to často stále totéž a není to zrovna zábavné programování. A ve výsledku někdy nevznikne zrovna ten nejpřehlednější kód. Smyslem mikrorouteru kontroleru je snadnější a hlavně přehlednější vývoj této logiky.

Výchozí kontroler Jet\MVC_Controller_Default v Jet MVC již s použitím mikrorouteru počítá. Tedy v praxi stačí ve vašem kontroleru implementovat metodu getControllerRouter, v ní vytvořit instanci Jet\MVC_Controller_Router a nadefinovat celou rozhodovací logiku. Pojďme si to rovnou ukázat prakticky a to na příkladu již zmiňovaného ukázkového modulu Content.Articles.Browser a jeho kontroleru:

public function getControllerRouter(): MVC_Controller_Router
{
    if( !
$this->router ) {
        
$this->router = new MVC_Controller_Router$this );

        
$path MVC::getRouter()->getUrlPath();

        
$this->router->addAction'list' )
            ->
setResolver( function() use ( $path ) : bool {
                if( 
$path == '' ) {
                    return 
true;
                }

                if( 
preg_match'/^page:([0-9]+)$/'$path$matches ) ) {
                    
$this->page_no $matches[1];
                    
MVC::getRouter()->setUsedUrlPath$path );
                    return 
true;
                }

                return 
false;
            } );

        
$this->router->addAction'detail' )
            ->
setResolver( function() use ( $path ) : bool {
                if( 
$path == '' ) {
                    return 
false;
                }

                
$current_article Content_Article::resolveArticleByURL$pathMVC::getLocale() );
                
                if( !
$current_article ) {
                    return 
false;
                }

                
$this->article $current_article;
                
MVC::getRouter()->setUsedUrlPath$path );

                return 
true;

            } );
    }

    return 
$this->router;
}

Toto je úplně nejzákladnější situace, ale zcela objasňuje smysl existence mikrorouteru a princip jeho funkce.

Pár věcí si zdůrazníme:

  • Instance mikrorouteru je vlastností kontroleru. Není to nutnost, ale dobrý zvyk, protože jak si ukážeme, tak mikrorouter může být užitečný ještě jinde (například pro tvorbu URL).
  • Mikrorouteru jsou předávány akce metodou addAction. Název akce koresponduje s akcí kontroleru - přesněji jednou z metod kontroleru. Tedy akce 'list' směřuje na metodu list_Action, akce 'detail' na metodu detail_Action.
  • Každá akce má mít resolver (nastavený metodou setResolver ), což je anonymní funkce, která rozhodne zda takto akce relevantní pro daný požadavek (vrátí true), nebo nikoliv (vrátí false). Cílem je aby bylo jasně vidět na základě čeho a jak se rozhodne o nasměrování požadavku na danou akci a předešlo se špagetování kódu.
  • Uvedená ukázka je pouze naprostý základ. Ve skutečnosti mikrorouter toho umí ještě víc: kontrolovat oprávnění a generovat URL akcí.

Toto je základní princip. Vřele doporučuji kouknout se na podrobný popis tříd Jet\MVC_Controller_Router a Jet\MVC_Controller_Router_Action. Tam se dozvíte další užitečné podrobnosti.

Předchozí kapitola
Jet\MVC_Controller_REST
Další kapitola
Jet\MVC_Controller_Router