Magento 2 Di Best Practices.
-
12-12-2019 - |
문제
Magento 2 Extension을 구축하고 있습니다 .... 음 ... 중요하지 않습니다. 멋진 물건을 말하자고 해보자.
그러나 다른 개발자가 확장 할 수 있도록 적절한 표준을 사용하여 빌드되는지 확인하고 싶습니다.
언제 인터페이스와의 조합에서 DI를 사용해야합니까?
여기서 맑게하기 위해서는 핵심 예입니다.
Class Magento\Core\Helper\Data
에는 다음과 같은 생성자가 있습니다.
.
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\App\State $appState,
PriceCurrencyInterface $priceCurrency,
$dbCompatibleMode = true
) {
parent::__construct($context);
$this->_scopeConfig = $scopeConfig;
$this->_storeManager = $storeManager;
$this->_appState = $appState;
$this->_dbCompatibleMode = $dbCompatibleMode;
$this->_priceCurrency = $priceCurrency;
}
내 질문은 VAR \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
에 초점을 맞추고 있습니다 (동일한 생성자에 다른 사람이 있음을 알고 있지만, 내가 생각하는 모든 경우에 적합합니다).
코어 모듈의 di.xml
에 따르면 var는 Magento\Framework\App\Config
의 인스턴스가됩니다.
.
<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />
그러나 필요할 경우 쉽게 변경할 수 있습니다.
언제 내 코드와 같은 인터페이스를 사용해야합니까?
나는이 불완전한 샘플 모듈 (광고 죄송합니다), 내가 그런 인터페이스를 사용했지만, 그들 모두는 핵심. 나는 내 자신 중 하나를 만들지 않았다. 내가해야 할까?
해결책
IMHO는 Mage2 구체적인 질문이 아니며, 일반적으로 인터페이스를 사용할 때 "더 일반적으로"이는 누군가가 확장 프로그램을 확장 할 수 있는지 원하는 위치에 달려 있습니다.나는 당신이 바꿀 수있는 사업 논리로 일하는 곳에서 어디에서나 말할 것입니다.;) 동작이없는 객체 (예 : 간단한 데이터 객체)는 대개 변경되지 않습니다.
100 % 유연하게되기를 원한다면 어떻게 든 모든 곳에서 인터페이스를 사용해야합니다.그러나 나는 그것을 과도하게 엔지니어링하지 않을 것입니다.나는 또한 개인적으로 http://odetocode.com/블로그 / Scott / Archive / 2009 / 06 / 08 / 언제 Do-i-i-interfaces.aspx 실제로 유용 할 때 소개
다른 팁
Magento2는 솔리드 원칙
의존성 반전 원칙은, 그 코드는 추상화 (인터페이스)에 의존해야한다고 말한다.
인터페이스 분리 원칙은 많은 클라이언트 특정 인터페이스가 하나의 범용 인터페이스보다 낫다고 말합니다.클래스는 또한 보호 된 인터페이스를 정의 할 수 있으므로 아키텍처 관점에서 더 선호되는 인터페이스가 더욱 선호됩니다.
또한 PHP는 클래스의 여러 상속을 지원하지 않지만 여러 인터페이스 구현을 지원합니다.그것은 인터페이스에 대해 하나의 점입니다.
그래서 간단한 규칙을 사용할 수 있습니다 : 사용할 무엇을 모르는 경우, 항상 인터페이스를 사용하십시오
ps.성능 인터페이스를 사용하지 않는 이유가 아닙니다