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