Laravel fasády - to zvládnu

Fasády mohou znít jako nějaký žargon, nicméně se nejedná o nic nového než OOP implementaci. V tomto článku vám vysvětlím jak fasády v Laravelu fungují a jak si vytvořit novou.

Než začneme je ještě potřeba pro jistotu zmínit dvě magické metody a stručně vysvětlit kdy se použijí:

Když zavoláte třídu MyFacade se statickou metodou giveMeSomething, tak se zjistí, že vaše třída tuto statickou metodu neobsahuje. Takže se volání přesune do magické metody __callStatic. Tato metoda existuje v základní třídě Fasade , ze které se vaše třída dědí. Uvnitř této metody se zavolá jiná statická metoda getFacadeRoot . A tato metoda poté opět zavolá jinou statickou metodu resolveFacadeInstance  ve které se zjistí, jestli název je string nebo objekt. Pokud vaše getFacadeAccessor vrátí konkrétní objekt, pak vrátí váš objekt. V opačném případě se zkontroluje, jestli string s tímto názvem má již přes service provider vyřešenou instanci nebo ne. Pokud ano tak se vrátí instance a pokud ne, Laravel se pokusí najít instanci ve vaší aplikaci a tu vrátit.

Takže pokud je následující kód vykonán, tak v principu funguje takto:

// ...
$user = Auth::user();
// ...

Vytvořte třídu, kterou bude fasáda volat:

namespace App\Extensions;

// tato trida se bude volat z fasady
Class Operation 
{
    public function add ($a, $b){
        return $a + $b;
    }
    
    public function subtract ($a, $b) {
        return $a - $b;
    }
}

Vytvořte třídu, která bude rozšiřovat Fasade:

namespace App\Extensions;

use Illuminate\Support\Facades\Facade;

class OperationFacade extends Facade 
{
    protected static function getFacadeAccessor() {
        // bud vrati 'operation';
        // nebo
        return new Operation();
    }
}

Pokud vrátíte string namísto objektu z vašeho OperationFacade::getFacadeAccessor , pak je ještě potřeba ještě vytvořit novou metodu v jakémkoliv registrovaném service provideru:

namespace App\Providers;

class AppServiceProvider extends ServiceProvider 
{
    public function boot () {
        $this->app->bind('operation', function() {
            return new Operation();
        });
    }
}

Nyní můžete fasádu zavolat kdekoliv budete potřebovat:

// web.php
Route::get('test-facade', function(){
    $a = OperationFacade::add(10, 30);
    $b = OperationFacade::subtract(20, 40);
    return [$a, $b];
});

Zavolejte routu a získáte 40 a -20.

Zdroj: medium.com Zdroj obrázku: phpgang.com