Обычно я просто добавляю зависимости через конструктор, но он становится очень многословным, когда родительский класс имеет зависимости и должен передавать их через всех детей.
Альтернативой является использование $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 .