2016-07-25 5 views
0

Я знаю, как работает контейнер Inversion of Control, и я знаю, как его создать. Но я знаю только, как это сделать, используя методы регистрации и разрешения.Как laravel разрешает зависимости на основе typehinting?

Я смотрел в документации Laravel, но я застрял в попытке выяснить, как Laravel может разрешить зависимость на основе typehinting. Где отсутствует ссылка для этой точной части?

Когда я использую более традиционный контейнер IoC, где я вручную разрешаю вещи, мне, по крайней мере, нужно вызвать статический метод для перехода. Кажется, что Laravel не нуждается в этом.

Может ли кто-нибудь направить меня в правильном направлении или создать крошечный пример?

Я работал мой путь через:

http://code.tutsplus.com/tutorials/dependency-injection-huh--net-26903

В резюмировать. Может быть, кто-нибудь может создать быстрый пример с автоматическим разрешением для ввода типа или это действительно сложно?

+1

По вашему вопросу, похоже, вы хотите знать, как Laravel разрешает DI через подсказку типа. То, что вы ищете, называется Reflection в PHP. С отражением вы создаете зеркальный объект класса внутри переменной, и вы можете перемещаться по нему, прежде чем создавать экземпляр. –

+0

Как огонь отражения всегда срабатывает, когда используется метод typehint? –

+1

это нет. Если вы уделяете пристальное внимание laravel, у вас есть только DI для классов/методов, которые Laravel вызывает для вас. Если вы экземпляр объекта вручную, вы увидите, что DI не спасет вас. –

ответ

3

Магия происходит в классе Container.php Laravel, где зависимости автоматически разрешаются с помощью отражения.

Только классы, созданные или создаваемые с использованием контейнера DI Laravel, получат преимущества от функциональности впрыскивания зависимостей.

+0

Я предполагаю, что все контроллеры просто создаются на основе маршрутизатора, который получает имя URL-адреса и контроллера. Где эта часть происходит? Фактически оператор «новый» для экземпляра контроллера. Также в какой момент контроллер соединяется с контейнером так, чтобы он мог использовать отражение от контейнера? –

+0

Все это происходит в методе 'build()'. Все классы, которые построены контейнером DI Laravel, построены внутри этого метода. В этом методе есть 2 точки возврата. Первая из них - [строка 761] (https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php#L761), где созданный экземпляр объекта создается с использованием ключевого слова 'new' if класс не имеет определенного метода '__construct()'. Вторая точка возврата - [строка 779] (https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php#L779), где класс создается с помощью аргументов. –