Par exemple pour appeler la méthode get() de la façade Cache ici :
$user = Cache::get('user:'.$id);
Il va fait appel à la méthode
protected static function getFacadeAccessor() { return 'cache'; } , provenant de la classe parente.
class Cache extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return 'cache'; }
}
On remarque qu'elle ne contient pas de méthode get(), mais plutôt une méthode statique getFacadeAccessor()
Et cette classe statique contient ceci :
protected static function getFacadeAccessor()
{
return App\Providers\ReportGeneratorServiceProvider::class;
}
App\Providers\ReportGeneratorServiceProvider::class
Elle récupère juste ta classe, mais comment arrive-t-il à l'appeler elle et ses méthodes, (ici get() ), de manière statique du coup?
Et bien c'est parce qu'elle est d'abord est instanciée dans le service container, ensuite Laravel peut faire appel à elle, via un service provider,
- return App\Providers\ReportGeneratorServiceProvider::class = return "cache"
Et le service container contient une classe register(); dans laquelle tu instancie ta classe, avec quelque chose style :
public function register()
{
$this->app->bind('Le\Chemin\Vers\Ta\Classe', function($app){
return new Classe();
});
}
Et comme tu le vois,
Par rapport ça :
public static function build() {
return new MaClass();
C'est exactement la même chose.
Voilà en gros.
Source :
- https://laravel.com/docs/s/5.7/facades#how-facades-work
- https://laravel.com/docs/s/5.7/container#binding-basics
- https://stackoverflow.com/questions/35809262/laravel-5-2-what-goes-in-facade-getfacadeaccessor-return