Facade in Laravel - Ce sunt, cum le folosim si cum ne facem propriile Facade

In acest articol am sa vorbesc despre fatadele din laravel, am povestesc putin cum de putem apela metode ce nu sunt statice ca si cand ar fi statice, de ce avem nevoie sa facem asta si mai ales cum putem implmenta si noi treaba asta :)

Fatadele ne ofera posibilitatea de a apela o metoda ca fiind statica, desi nu este statica. Nu stiu daca m-am exprima chiar corect, am sa incerc sa explic printr-un exemplu:

Presupunem ca vrem sa bagam ceva in cache, o sa facem ceva de genul:

cache()->set('name', 'Iron Man');

apoi, pentru a lua valoarea respectiva din cache vom face:

cache()->get('name');

Ok, am scris treaba asta in routes/web.php, am dat un dd de get si am vazut ca treaba asta functioneaza exact cum ar trebui si ca set()/get() sunt metode non-statice.

Dar, daca ai mai lucrat cu laravel pana acum stii foarte bine ca poti apela fix acelasi metode folosind fatadele, adica:

Cache::set('name', 'Iron Man');

si, de asemenea get-ul

Cache::get('name');

Din nou, rulam aceasta treaba si observam ca functioneaza exact ca mai devreme, fara probleme.

Hai sa mergem la cache repository \Illuminate\Cache\Repository si sa vedem ce metode avem aici.

Putem observa foarte rapid ca metodele \Illuminate\Cache\Repository::set si \Illuminate\Cache\Repository::get nu sunt statice.

Ok, deci am verificat ca putem apela metodele astea atat static, cat si normal, ne-am uitat la cod sa vedem cum sunt ele de fapt scrise, dar totusi cum le apeleaza laravel-ul atat static cat si normal?

Hai sa deschidem fatada clasei de Cache de la \Illuminate\Support\Facades\Cache si observam ca extinde clasa Facade, iar aceasta clasa Cache (pe care am folosit-o mai devreme sa apelam set()/get()) are o singura metoda, getFacadeAccessor() care intoarce un string.

Acest string intors este de fapt numele cu care a fost bind-uita pe service container clasa pe care o cautam, dar despre service container am sa scriu un articol separat pentru ca este un subiect destul de mare.

Ok, cred ca am raspuns la primele 2 intrebari, Ce este Facade? Cum le folosim? Ne-a mai ramas ultima treaba, cum putem implementa si noi Facade pentru clasele noastre?

Pentru a explica asta am sa iau un exemplu cat se poate de simplu, haideti sa pornim de la clasa noastra:

class Bacon {
	public function fry()
	{
		return 'we put bacon in pan';
	}
	
	public function eat()
	{
		return  'bacon in plate then in belly';
	}
}

Ok, in clipa asta putem apela cele 2 metoda in modul traditional:

$bacon = new Bacon():
$bacon->fry();
$bacon->eat();

Dar, cum putem face o fatada pentru aceasta clasa?

Hai sa definim o clasa noua BaconFacade:

class BaconFacade{
    public static function __callStatic($name, $args)
    {
        dd($name);
    }
}

dupa cum putem observa am pus un dd (die & dump) aici, acum daca apelez

BaconFacade::oriceNumeDeFunctieAici()

o sa imi intoarca string-ul oriceNumeDeFunctieAici.

Ok, acum, daca bind-uiesc clasa mea la container astfel:

app()->bind('bacon', function(){
   return new Bacon(); 
});

In clasa BaconFacade, in metoda magica callStatic pot lua clasa dorita din service container si pot apela metoda cautata.

Iata cum arata clasa mea BaconFacade acum:

class BaconFacade{
    public static function __callStatic($name, $args)
    {
        return app()->make('bacon')->$name();
    }
}

Acum, daca apelez metoda fry() om mod static:

dd(BaconFacade::fry());

o sa primesc sirul de caractere

"we put bacon in pan"

Cred ca am explicat sum functioneaza Facade si am invatat cum sa facem si noi o fatada.

Sper ca din acest articol ati invatata ceva si daca aveti intrebari va rog sa le lasati mai jos, in comentarii.

Avem un cod de conduita.
Folosim cookie-uri pentru a oferi functionalitatile critice ale aplicatiei Invata-Programare. Folosim cookie-uri si pentru a analiza traficul, pentru care e nevoie de consimtamantul dvs. explicit.