DZ
Аналогично и у Red Hat, они сидят во главе кучи opensource продуктов, при этом развивая свои enterprise форки и продвигая свою поддержку. Крутая модель бизнеса, снимаю шляпу.
Size: a a a
DZ
DZ
ST
y
O
O
O
O
O
d.
O
ST
ST
SS
AV
А
app(Service::class), resolve(Service::class), Container::getInstance()->get(Service::class)
. Надеюсь, не надо объяснять, почему это плохо. У базового фасада есть доступ к контейнеру, дается он фасаду тут https://github.com/laravel/framework/blob/8.x/src/Illuminate/Foundation/Bootstrap/RegisterFacades.php#L22. У дочерних фасадов должно быть тут https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Facades/Facade.php#L176 указано имя сервиса, по которому его можно найти в контейнере: это или service_name
или Service::class
или SomeInterface::class
. Главное, чтобы фасад смог этот сервис разрезволить. Дальше никакой магии, обычное прокси: https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Facades/Facade.php#L253-L261. Первая проблема – это сервис-локатор. Вторая проблема – вместо одного сервиса, ты делаешь два – сервис и фасад. Третья проблема – автокомплит. Забавно видеть, как ребята целые PR заводят ради phpdoc: https://github.com/laravel/framework/pull/35911/files, https://github.com/laravel/framework/pull/35201/files, https://github.com/laravel/framework/pull/34352/files. А потом хотят все их разом снести: https://github.com/laravel/framework/pull/36585/files. Прям топовая разработка, важные фичи, их обязательно надо отразить в release notes. Следующая проблема – неявные зависимости. Вызвав такой сервис https://pastebin.com/HdzQ3sbR, сложно сказать, какие у него зависимости. Мало того, что просто зависимости неявные, так у фасадов есть еще хуки https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Facades/Facade.php#L32, на которые можно подписаться из провайдера, что делает поведение фасадов совершенно непредсказуемым. Отсюда также возникает сложность с тестированием, потому что коллега мог не позаботиться о том, чтобы настроить фасады так, чтобы в тестах использовались какие-нибудь ин-мемори хранилища, моки http клиентов и тому подобное (пример из реального опыта, когда запустив однажды в легаси-проекте тесты с хоста, а не из докера, мы обнаружили, что тесты ходили по http и использовали реальный брокер в виде кролика, что скрыло много багов). Да, у фасадов есть свапы https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Facades/Facade.php#L150, моки https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Facades/Facade.php#L112 и прочие инструменты для упрощения тестирования, которые почему-то становятся частью твоей бизнес-логики. Таким образом, если опираться на такой код https://pastebin.com/7gBWmCDT, видно, что я всегда знаю и контролирую зависимости, которые передаю, всегда могу их легко замокать в тестах и подменить в реальном коде, если потребуется очень специфическая зависимость в конкретном месте, потому что управляю кодом напрямую, а не сбоку через контейнер. И напоследок вспомним замечательное: https://github.com/laravel/ideas/issues/1088. Фасады любые сервисы делают синглтонами, даже если в провайдере ты юзал bind
, а не singleton
, потому что инстансы кэшируются https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Facades/Facade.php#L198. Следующий урок горе-ларавельщикам будет 1000 рублей за объяснение.DZ
А
DZ
А