Добре, тому вчора ми вели велику розмову з іншими людьми з громади Magento щодо прямого використання ObjectManager
класів / шаблонів .
Мені вже відомі причини, чому ми не повинні використовувати ObjectManager безпосередньо, цитуючи Алана Кента :
Причин кілька. Код буде спрацьовувати, але найкращою практикою є не посилання на клас ObjectManager безпосередньо.
- Тому що ми так говоримо! ;-) (краще виражається як послідовний код - хороший код)
- Код може використовуватися з іншою структурою введення залежності в майбутньому
- Тестування простіше - ви передаєте макетні аргументи для необхідного класу, не надаючи макет ObjectManager
- Це забезпечує чіткіші залежності - очевидно, від чого залежить код через список конструкторів, а не залежність, прихована в середині коду
- Це спонукає програмістів краще думати про такі поняття, як інкапсуляція та модуляризація - якщо конструктор стає більшим, можливо, це знак, коду потрібно рефакторинг
З того, що я бачив у StackExchange, багато людей схильні шукати легке / коротке / нерекомендоване рішення, наприклад, щось подібне:
<?php
//Get Object Manager Instance
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
//Load product by product id
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($id);
Замість того, щоб пройти болючий, але рекомендований процес :
- створення модуля
- декларація уподобань
- вводити залежності
- оголосити публічним методом
Однак, і ось тут виникає дилема, основні файли Magento 2 часто викликають безпосередньо ObjectManager . Короткий приклад можна знайти тут: https://github.com/magento/magento2/blob/develop/app/code/Magento/GoogleOptimizer/Block/Adminhtml/Form.php#L57
Ось ось мої запитання:
- Чому Magento робить те, що нам рекомендують не робити? Чи означає це, що є деякі випадки, коли нам слід скористатися
ObjectManager
безпосередньо ? Якщо так, то які випадки? - Які наслідки використання ObjectManager безпосередньо ?
The intent of zend-servicemanager is for use as an Inversion of Control container. It was never intended as a general purpose service locator [...]
. Що стосується і М2. Також перевірте There are valid use cases
розділ, який, знову ж таки, стосується і тут.