Говоря о шаблоне проектирования в Laravel (3) Контейнер-контейнер

задняя часть Шаблоны проектирования контейнер Laravel
Говоря о шаблоне проектирования в Laravel (3) Контейнер-контейнер

Время чтения: 5 минут

Техническая подготовка: знакомство с использованием Laravel

Контейнер

1. Что такое контейнер?

Слово «контейнер», вероятно, знакомо детям, которые использовали Laravel, но кажется, что они никогда не видели его в ежедневной разработке бизнеса.Давайте посмотрим, что он делает сегодня.В этой статье в качестве примера используется упрощенная версия Laravel Lumen.

Где он появляется в первую очередь?

Мы можем найти его по входному файлу, а это$app, то это$appчто именно? Давайте посмотрим поближе

Как вы можете видеть в папке app.php, это$appЭто Laravel\Lumen\Application::class, и этот класс наследует класс Container, поэтому класс Application является контейнером в Laravel.

«Чжао Туншо, что такое контейнер?»

Контейнер в Laravel на самом деле является ядром всего фреймворка.Как вы можете видеть в index.php на рисунке выше, после поступления запроса index.php на самом деле просто вызывает$app->run()метод.

После синтаксического анализа URL-адреса, обработки промежуточного программного обеспечения, внедрения зависимостей, пока запрос не войдет в бизнес-метод, все они обрабатываются контейнером.

2. Как работает контейнер?

Как упоминалось выше, большинство функций фреймворка Laravel реализованы в контейнере, а наиболее часто используемая функция — это сервис-провайдер.

Здесь мы объясняем, как работает поставщик услуг в контейнере, вызывая класс Facade базы данных.

Прежде всего, вы можете видеть, что в приложении "db" привязанregisterDatabaseBindings()Сюда.

существуетregisterDatabaseBindings()метод, используя предоставленную структуруsingleton()Зарегистрирована анонимная функция, связанная с "db", и эта анонимная функция является синтаксическим анализатором для "db".

В предыдущей главе мы упомянули, что когда мы вызываем класс DB статически, режим фасада Laravel вызываетresolveFacadeInstance()Перейдите к контейнеру, чтобы проанализировать фактический объект «db».

Можно видеть, что фактическая операция внутри заключается в использованииstatic::$app[$name]письма, чтобы получить.

Поскольку Контейнер в Laravel реализует ArrayAccess, фактический вызов войдет в Контейнер.offsetGet()метод, то есть вводmake()метод, а поскольку фактическим объектом контейнера является класс Application, он сначала войдет в Applicationmake()метод.

В методе make, наконец, вышеупомянутый$availableBindings, то есть здесь будет вызываться предыдущийregisterDatabaseBindings()метод, который регистрирует парсер для "db". Затем вызовите родительский класс, который является контейнеромmake()метод.

И снова в дело вступает метод make().resolve()середина.

(Должен сказать, у меня тоже закружилась голова, когда я впервые прочитал код фреймворка, просто привыкните к нему)

существуетresolve()Здесь контейнер пойдет первым$this->instanceslookup, то есть массив для хранения созданных объектов.

Когда он недоступен, он пройдет$this->getConcrete()Получите синтаксический анализатор "db", который мы зарегистрировали ранее, который вызывает начало статьи.registerDatabaseBindings()Анонимная функция в , получает экземпляр "db" и, наконец, возвращает его предыдущему статическому вызову БД.

(Что касается того, как работает анализатор анонимных функций, заинтересованные дети могут пойти посмотреть loadComponent и зарегистрировать процессы официальной документации, а также увидеть исходный код лично для более впечатляющего впечатления)

3. Какая польза от контейнера?

Из приведенного выше описания мы можем знать, что в контейнере есть массивinstances[]Одноэлементный шаблон, содержащий созданные объекты.

Объекты, которые не созданы, также имеют механизм ассоциации, аналогичный синтаксическому анализатору.

Самым большим преимуществом этого подхода является то, что он может уменьшить накладные расходы на создание объектов.Например, если интерфейсу необходимо использовать Redis и БД, фреймворк вызовет синтаксический анализатор для анализа этих двух объектов и сохранит их в массиве для последующего использования. , повторное использование в логике.

Когда интерфейс не требует Redis и БД, можно сэкономить накладные расходы на эти два объекта, и нет необходимости изменять строку кода.

4. Вывод

На этом краткий рассказ о контейнерах закончен, если вы чувствуете, что запутались, значит, вы действительно читали o( ̄▽ ̄)d.

Не расстраивайтесь, идите и следуйте исходному коду самостоятельно, это чувство головокружения постепенно исчезнет.

----- End -----

больше хороших статей

Пожалуйста, отсканируйте QR-код ниже

Добро пожаловать, чтобы обратить внимание~