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é...
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.
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“.
Vytváranie fasád je veľmi jednoduché:
Vytvoríte samotnú fasádu
class Meta extends Facade {
protected static function getFacadeAccessor()
{
return 'meta';
}
}
Vytvoríte ServiceProvider
class MetaServiceProvider extends ServiceProvider {
public function register()
{
$this->app->bind('meta', 'App\Meta\Meta');
}
}
Implementujete samotnú triedu (V tomto prípade App\Meta\Meta). Všetky verejné metódy bude vďaka tomu možné volať „staticky“.
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 :).
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ť