자, 어제 우리는 클래스 / 서식 파일 의 직접적인 사용에ObjectManager
관해 마 젠토 커뮤니티의 다른 사람들과 큰 대화를 나 had습니다 .
Alan Kent를 인용하면서 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 에서 간단한 예를 찾을 수 있습니다.
내 질문은 다음과 같습니다.
- 마 젠토가 왜 우리에게하지 말라고 추천 한 일을 하는가? 그것은 우리가
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 [...]
. M2에도 적용됩니다. 또한 There are valid use cases
여기에도 적용되는 섹션을 확인 하십시오.