Laravel fasády (Facades)

xvital
napísal @xvital (460), pred 4 rokmi

Pravdepodobne ste v minulosti narazili na rôzne vyjadrenia a názory, ktoré hanili Laravel kvôli používaniu Facades s tým, že ide o tzv. statické peklo. Niet sa čomu čudovať – ak venujete päť minút rýchlemu štúdiu akéhokoľvek Laravel projektu, narazíte na množstvo „staticky“ volaných metód. A statické metódy sú zlé...

Ako Fasády v skutočnosti fungujú?

Nemusíte sa báť, žiadne statické metódy v triedach Fasád v skutočnosti neexistujú. Ide o dobre premyslený koncept, ktorý využíva jednoduchosť a praktickosť volania statických metód – využíva teda tradičný koncept volania statickej metódy Class::method(), no súčasne volá metódu nad inštanciou triedy z IoC kontajnera. Reálne preto tento koncept neohrozuje testovateľnosť a nejde o triedy, ktoré by obsahovali množstvo statických metód.

Ako je to možné?

Odpoveďou na otázku, ako môže Laravel zavolať na oko staticky volanú metódu nad inštanciou triedy je celkom jednoduchá: Magic metóda __callStatic() v PHP. __callStatic() je špeciálna metóda (tzv. Magic metódy), ktorá je zavolaná vždy, ak sa na triedu volá nedostupná statická metóda.

__callStatic() is triggered when invoking inaccessible methods in a static context. A to je presne miesto, kde Laravel implementuje logiku spracovania takéhoto volania.

Pozrime sa teda, ako vyzerá metóda __callStatic() abstraktnej triedy Facade:

/**
     * Handle dynamic, static calls to the object.
     *
     * @param  string  $method
     * @param  array   $args
     * @return mixed
     *
     * @throws \RuntimeException
     */
    public static function __callStatic($method, $args)
    {
        $instance = static::getFacadeRoot();

        if (! $instance) {
            throw new RuntimeException('A facade root has not been set.');
        }

        return $instance->$method(...$args);
    }

V skutočnosti Laravel vytiahne inštanciu a zavolá na ňu metódu, ktorú sme volali „staticky“.

Ako vytvárať fasády

Vytváranie fasád je veľmi jednoduché:

  1. Vytvoríte samotnú fasádu

    class Meta extends Facade {
    
    protected static function getFacadeAccessor()
    {
        return 'meta';
    }
    }
  2. Vytvoríte ServiceProvider

    class MetaServiceProvider extends ServiceProvider {
    
    public function register()
    {
        $this->app->bind('meta', 'App\Meta\Meta');
    }
    }
  3. Implementujete samotnú triedu (V tomto prípade App\Meta\Meta). Všetky verejné metódy bude vďaka tomu možné volať „staticky“.

Prečo používať fasády?

Najväčšou devízou fasád je jednoduchosť ich použitia. Menej práce, rovnaká testovateľnosť, prehľadnejší, jednoduchší kód, v ktorom idete priamo na vec. Na príklade môžete vidiet, že implementácia fasád je naozaj jednoduchá a rýchla. Aké jednoduche je ich používanie, už pravdepodobne dobre viete :).

Ešte nie si členom CZ/SK Laravel komunity?

To možeš ľahko zmeniť. Registrácia je zdarma a ako registrovaný člen získaš množstvo výhod. Prečítaj si prečo by si mal byť členom.

Prihlásiť sa Zaregistrovať

Mohlo by Ťa zaujímať: