Обычно я просто добавляю зависимости через конструктор, но он становится очень многословным, когда родительский класс имеет зависимости и должен передавать их через всех детей.
Альтернативой является использование $this->dependancy = App::make('Dependancy')
в родительском классе. Тогда и родительский, и дочерний конструкторы могут быть пустыми. Есть ли недостаток, чтобы сделать это таким образом?
Недостаток вашего подхода, то, что вы предлагаете, сделает ваше приложение менее подверженным тестированию.
Я имею в виду, что если вы попытаетесь написать единичный тест для родительского класса, вы больше не будете тестировать этот родительский класс в изоляции. Теперь ваш тест также зависит от результатов зависимости, объявленной внутри родительского класса.
Если вы передаете эту зависимость через сквозную инъекцию конструктора (или любой тип инъекции), вы контролируете зависимость и можете mock / заглушить вывод из нее и лучше протестировать ваш родительский класс в изоляции.
Прежде всего, нет недостатка в использовании App::make('...')
или app('...')
но если вы используете подсказку типа в конструкторе, вам не нужно вводить зависимости вручную. Например, если у вас есть что-то вроде этого:
class SomeController extends BaseController { protected $otherClass = null; public function __construct(SomeOtherClass $otherClass) { $this->otherClass = $otherClass; } }
Теперь, если вы используете класс SomeController
Laravel
автоматически SomeOtherClass
в класс SomeController
и если ваш SomeOtherClass
имеет свои собственные зависимости, то Laravel
будет вводить их, если они будут SomeOtherClass
в тип. Таким образом, вы можете использовать Dependency Injection
в конструкторе над App::make(...)/app(...)
и было бы лучше, если бы вы использовали Interface
для ввода подсказки вместо concrete class
. Было сказано, что программа по interface
не implementation
(конкретный класс).
Вообще говоря, есть одна вещь в технике инъекций зависимостей, и именно в том случае, когда вы составляете class
с другими объектами, это может выглядеть сложным. Фактически, инъекция зависимостей – это способ создания класса путем смешивания других объектов во runtime
через метод constructor
(состав над наследованием), но иногда может оказаться сложным выяснить связь объекта друг с другом, если существует так много зависимостей. В конечном итоге это хороший дизайн, который дает нам возможность отделить объекты друг от друга, и вам нужно мудро выбирать, когда использовать его.
Обновление: на самом деле, в Laravel
когда вы вводите намек на dependency
в методе конструктора, framework
автоматически вводит зависимости, читая type
зависимого объекта и за сценой, Laravel
использует метод App::make(...)
. Итак, если вы не используете инъекцию зависимостей, вам просто нужно вручную использовать App::make(...)
, вот и все. В обоих случаях App::make()
используется либо автоматически каркасом, либо разработчиком. Таким образом, используйте App::make()
без каких-либо колебаний, это безопасно и лучше подходит для отграничения зависимостей друг от друга.
Другими словами, если вы набираете намеки на зависимости в методе конструктора, то Laravel
будет использовать App::make(...)
чтобы автоматически вставлять их, но если вы не набираете подсказку, тогда вам нужно вручную ввести их и в этом случае вы будете использовать App::make()
вместо рамки, вот и все. Для автоматического разрешения зависимостей вам нужно ввести подсказку о своих зависимостях, но если вы вручную вводите свои зависимости, вам не нужно набирать подсказки и без подсказки типа, Laravel
не может автоматически вводить какие-либо зависимости, и это имеет смысл. Кстати, я не думаю о testing
.