Fațadele sunt unul dintre lucrurile cheie pe care ar trebui să le înțelegeți atunci când învățați Laravel.

Mi-a luat o perioadă considerabilă de timp să-mi dau seama cum funcționează fațadele și scriu acest lucru pentru a ajuta pe oricine are probleme să își înfășoare capul în jurul conceptului.

În acest articol vom acoperi ce sunt fațadele, cum sunt folosite în Laravel, cum vă puteți construi propria fațadă simplă și multe altele.

Ce este o fațadă? Și ce este un wrapper?

O fațadă din Laravel este o înfășurare în jurul unei funcții nestatice care o transformă într-o funcție statică.

Cuvântul „wrapper” poate fi folosit și la descrierea modelelor de proiectare. Înfășurarea unui obiect pentru a oferi o interfață simplificată este deseori descrisă drept modelul „fațadei”.

Deci, pe scurt, împachetare este fațada.

Înainte de a vă scufunda mai adânc în fațade, este important să înțelegeți ce funcții statice și nestatice sunt în PHP.

Metode statice

În metodele statice nu ni se cere să creăm o instanță a unei clase pentru a o face referire. Metodele statice utilizează puncte duble (: 🙂 atunci când accesează proprietăți sau metode ale unei clase:

<?php
class Calc {
    const GOLDEN_RATIO = '1.618';
}

echo Calc::GOLDEN_RATIO;  //1.618

Cuvinte cheie rezervate precum self , static și parents este folosit pentru a face referire la proprietăți sau metode dintr-o clasă:

<?php
class backend {
	private const language = "php";
	public static function language() {
    	echo self::language;
  	}
}

backend::language();  //php

Metode nestatice

Metodele nestatice necesită instanțierea unei clase date. Cu alte cuvinte, necesită o instanță a clasei pentru a executa:

<?php
class backend{

	public function language($name){
		
		echo $name;
	}

}


$test = new backend; //creating an instance of the class

$test->language('php'); //php

Acum că am trecut peste metodele statice și nestatice, ne putem scufunda mai adânc în fațade în Laravel.

Fațade Laravel

În vendors > laravel  > framework > src > illuminate > support > Facades director, există o listă de fișiere care sunt diferitele fațade livrate în mod implicit cu Laravel.

Iată o captură de ecran a aspectului structurii directorului în editorul nostru:

Cum se utilizeaza fatadele in Laravel

Să folosim codul de lucru de la Log.php pentru a examina fațadele în detaliu – aceeași explicație ar trebui să se aplice tuturor fațadelor din orice aplicație Laravel.

Fațada jurnalului lui Laravel

Iată codul pentru Laravel’s Log faţadă:

<?php

namespace IlluminateSupportFacades;

class Log extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'log';
    }
}

Log este o clasă care extinde fațada de bază care este din spațiul de nume de mai sus.

În cadrul Log clasa avem un modificator de acces protejat, getFacadeAccessorși ceea ce face această metodă este că se întoarce log.

Numele acestei fațade, log, este returnat, astfel încât să putem accesa fațada numită oriunde în aplicația Laravel fără a o inițializa. Deci putem face ceva de genul Log::info('hello there'); oriunde cu ușurință.

După cum puteți vedea, fațadele fac codul mai ușor de citit, mai organizat și fac testarea de 10 ori mai ușoară.

De când am aflat despre Log de la unul dintre colegii mei, a fost instrumentul meu preferat de depanare.

Cum se creează o fațadă în Laravel

În această secțiune vom implementa propria noastră fațadă. Principalul obiectiv aici este de a ajuta cursanții să înțeleagă modul în care funcționează fațadele Laravel.

Vom face acest lucru creând un StudentFacade care va extinde proprietățile de pe o fațadă de bază care returnează o proprietate de nume după ce a fost rezolvată. Această proprietate de nume va fi de tip șir și va fi returnată de fiecare dată când instanțiem clasa așa cum se arată mai jos:

1611460864 5 Cum se utilizeaza fatadele in Laravel

Curios cum vom realiza acest lucru? Urmăriți-vă în timp ce vă voi plimba prin pași.

Nu ne vom crea fațada folosind convenția normală Laravel unde avem .php file în app > facade și apoi altul în providers înainte să ajungem să-l înregistrăm în config > app.

În schimb, ne vom conforma cu web.php în interiorul routes pentru această ilustrație, deoarece încercăm doar să vedem cum funcționează fațadele sub capotă într-o aplicație tipică Laravel.

În primul rând, să începem cu asta în web.php:

<?php 
class Student{
    public function students(){
        return 'Sean';
    }
}

 app()->bind('student', function(){
 	return new Student;   
 }); 

Am creat o clasă Student, iar în interiorul său avem un non-static students metoda care returnează o serie de studenți.

Apoi numim lega metoda de a face ca aceasta să fie instantaneu new Student deci nu mai trebuie să facem acest lucru manual.

Apoi, să creăm o bază Facade clasă încă în cadrul aceluiași web.php:

 class Facade{
    public static function __callStatic($name, $args){
        return app()->make(static::getFacadeAccessor())->$name();
    }
    
    protected static function getFacadeAccessor(){
        //override take place 
    }
}

Orice fațadă pe care am putea-o crea mai târziu va extinde proprietățile acestei fațade de bază.

În cadrul Facade clasa avem o __callStatic metoda magică care ne ajută să rezolvăm static::getFacadeAccessor() din recipientul cu app()->make(). Și cu aceștia putem accesa $name proprietate.

class StudentFacade extends Facade {
	protected static function getFacadeAccessor(){
    	return 'student';
    }
}

Aici, StudentFacade moștenește proprietățile fațadei de bază. Apoi, anulăm getFacadeAccessor() și setați valoarea de returnare să fie orice avem de fiecare dată când instanțiem în legătura de mai sus student.

StudentFacade::students(); //output "Sean"

Când încercăm să numim fațada pe care am creat-o, ea revine „Sean” așa cum era de așteptat. Acum, în pasul final, trebuie să punem împreună toți acești pași:

<?php

class Student{
    public function students(){
        return 'Sean';
    }
}

 app()->bind('student', function(){
    return new Student;   
 }); 
 
 
 class Facade{
    public static function __callStatic($name, $args){
        return app()->make(static::getFacadeAccessor())->$name();
    }
    
    protected static function getFacadeAccessor(){
        //override take place 
    }
}

class StudentFacade extends Facade {
    protected static function getFacadeAccessor(){
        return 'student';
    }
}

//log or die it to the output
dd(StudentFacade::students());

1611460864 119 Cum se utilizeaza fatadele in Laravel

Concluzie

Sper că până la sfârșitul acestei lecții ați reușit să vă extindeți cunoștințele despre lucrul fațadelor. Dacă aveți întrebări sau doriți să continuați conversația, nu ezitați să trimiteți un tweet la mine.

Referințe

Tutorial pentru începători Laravel – Bitume

Ce este WRAPPER în programare, ce ajută să faci? – Stackoverflow