Intereting Posts
jQuery / Ajax / PHP прикованные кнопки выбора PHP glob () для отображения файла, который не начинается с подчеркивания? Как я могу отсортировать массив строк UTF-8 в PHP? Автозаполнение JQuery в codeigniter для получения значений, но не отображения их Zend \ Mvc \ Router \ Http \ Метод и дочерние маршруты В любом случае защита вашего сайта от внешнего сайта scandir jquery post данные в php-скрипт и немедленно отображать его в том же файле сценария php Удаление нежелательных заголовков из электронной почты (для безопасности) Анализ XML с помощью PHP и XMLReader Значение входного значения FormType по умолчанию в той же форме Неустранимая ошибка: Uncaught CurlException: 7: не удалось подключиться к хосту, заброшенному в … src / base_facebook.php в строке 887 PHP-скрипт, сообщающий о прогрессе в Client Проверка подлинности Windows с помощью PHP на IIS почему мой php.ini не найден? модальное всплывающее окно заполняет только данные первого элемента на всех элементах элементов

В Laravel любой недостаток использования App :: make (''), а не инсталляции конструктора?

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

Альтернативой является использование $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 .