Foo::bar()
Новый, пользовательский, фасад создается уже после создания сервис-провайдера, регистрирующего нужный класс в сервис-контейнере (глобальном объекте App) по текстовому ключу.
Фасад должен наследоваться от родительского класса Facade и переопределить единственный метод: getFacadeAccessor(). Его задача - указать, что вы хотите получить из контейнера (текстовый ключ указанный в сервис-провайдере).
Родительский класс Facade использует магический метод PHP __callStatic() для перенаправления вызовов методов с вашего фасада на полученный объект.
Пример класса фасада в Laravel:
<?php namespace App\Helpers\Facades; use Illuminate\Support\Facades\Facade; class SaveStr extends Facade{ protected static function getFacadeAccessor() { return 'save'; } }вызов метода getFacadeAccessor() возвращает ключ по которому в сервис-контейнере регистрируется нужный класс в сервис-провайдере, в данном случае 'save'.
Например, когда вы вызываете фасад Cache:
Cache::get()Laravel получает объект CacheManager из сервис-контейнера и вызывает метод get() этого класса.
Это происходит от того, что сервис провайдер данного класса (файл vendor\laravel\framework\src\Illuminate\Cache\CacheServiceProvider.php) привязывает ключ 'cache' к классу CacheManager, который создается при запросе данного объекта:
public function register() { $this->app->singleton('cache', function ($app) { return new CacheManager($app); }); …
Кроме того, для удобного использования фасадов создают алиас в массиве aliases в файле config\app.php:
'Cache' => Illuminate\Support\Facades\Cache::class,
Алиасы позволяют задать любое короткое и понятное названия для сервиса, который предоставляет определенный класс связанный с данным фасадом.
То есть, фасады не является чем-то обязательным, использовать зависимости и получение сервисов из сервис-контейнера можно и без них. Фасады создаются только для удобства использования:
- статический» интерфейс к классам;
- удобное обращение к нужному сервису с помощью алиаса.
Узнать подробнее про сервис-контейнер, сервис-провайдеры и использование фасадов можно в статье Архитектура Laravel - практическое применение.