Проблемы с пониманием фасада в Laravel

По большей части я понимаю идею за фасадом и то, как детали создания экземпляра объекта скрыты за статическими вызовами.

Итак, если мы посмотрим на этот простой пример здесь: Пример

Мы видим подобный код для фасада, который на данный момент просто устанавливает своего рода псевдоним. На данный момент кажется, что фасад еще ничего не знает о классе Superuser.

class SuperuserFacade extends Facade
{
    protected static function getFacadeAccessor() { 
        return 'MyAlias'; 
    }
}

Логика приклеена сервис провайдером тут похоже:

class SuperuserServiceProvider extends ServiceProvider 
{
    public function register() {
        App::bind('MyAlias', function(){
            return new Superuser;
        });
    }
}

Но он просто связывает класс с псевдонимом фасада MyAlias. Зачем возиться с этим фасадным классом и двумя отдельными файлами, разве мы не можем сделать всю эту логику прямо в сервис-провайдере? Или, альтернативно, в поставщике фасада он просто возвращает класс Superuser?

Кажется, что у нас есть фасад, который на самом деле ничего не делает, а затем другой файл сообщает этому фасаду, что делать. Почему эти проблемы были разделены?


person Rob    schedule 26.06.2014    source источник


Ответы (1)


Фасадный класс — это простой прокси — он направляет любые вызовы фасадного класса в корневой класс, который извлекается из контейнера IoC через фасадный метод доступа (в данном случае MyAlias).

  1. Я звоню Superuser::whoami()

  2. Фасад суперпользователя говорит: «Хорошо, мне нужно найти класс, для которого я являюсь прокси».

  3. Фасад вызывает getFacadeAccessor(), чтобы определить, какую привязку IoC нужно получить и впоследствии вызвать.

  4. Фасад запрашивает ключ MyAlias из контейнера IoC. Затем контейнер возвращает существующий класс, если он уже был создан, или запускает связанное замыкание, которое создает новый экземпляр Superuser.

  5. Теперь, когда фасад знает, вызовы какого класса он передает, он перенаправляет вызов метода whoami() только что возвращенному экземпляру Superuser, который затем возвращает то, для чего он предназначен.

Метод register() поставщика услуг просто регистрирует привязку к контейнеру IoC, чтобы его можно было получить позже всем, кто в нем нуждается. Вот и все. MyAlias — это простой строковый ключ, используемый для поиска этой привязки.

Фасад позволяет вам использовать класс, связанный с IoC, как если бы это был статический класс.

Я рекомендую прочитать другие статьи об этой концепции, потому что статья, на которую вы ссылаетесь, является неточной и не очень информативной о том, почему что-то работает. Вот статья Криса Фидао получше.

person Aken Roberts    schedule 26.06.2014
comment
Я понимаю логику его подключения, но зачем его разделять, почему бы просто не вернуть Facade return new Superuser;, а не псевдоним MyAlias? - person Rob; 16.07.2014
comment
@Rob Потому что фасад - это просто прокси или указатель на существующий элемент. Не предполагается создавать новый объект, просто направить вызов существующему. - person Aken Roberts; 16.07.2014