magento2에서 __construct 및 _construct는 무엇입니까?


21

Magento 2에서 대부분의 클래스에는이 두 가지 구문 ( __construct_construct) 메소드가 있습니다. 그들 사이의 차이점은 무엇입니까?

답변:


17

그것이 Magento 1과 Magento 2 사이에서 바뀌 었는지 확실하지 않습니다. 아마도 내가 Magento 1에서 아는 것과 함께 갈 것입니다.

_construct애프터 호출됩니다__construct

__construct코드에서 PHP 네이티브 메소드를 덮어 쓰거나 사용해서는 안됩니다. 클래스를 시작할 때 안전한 방법으로 코드를 실행하려면 사용하십시오 _construct.

Magento는 네이티브 __construct를 사용하여 특정 모델에 적합한 캐시 태그를 정의하는 등 클래스를 사용할 수 있도록 모든 것이 '준비'되도록합니다.


15

_construct의 방법은 있었다 "Varien 발명" 모델, 도우미 및 블록 일부 초기화 논리를 포장하는 데 사용됩니다.

따라서 항상 Magento 팩토리를 사용하므로 M1 모델 / 블록 또는 도우미에서 기본 __construct () 메서드 를 변경하거나 다시 선언하는 것은 드문 일 입니다. 그러나 호환성에 관심이 있다면 사용에 관한 문제 / 나쁜 습관은 아닙니다.

M2에서 _construct () 메소드는 여전히 일부 부분에 존재하며 동일한 목적으로 사용되지만 이제는 (M2에서) 모든 DI 로직이 __constructor ()에 의해 구현되므로 코드 기반에서 많은 구문 선언을 찾을 수 있습니다.

BTW Mage::getModel()는 M2 와 같은 공장이 더 이상 없습니다 .

다른 말로:

_construct () 메소드는 어떤 클래스에 젠토에 의해 구현되며, 그것은 내부에서 자동으로 불리는 __construct의 당신은 당신이 개체를 생성 한 후 몇 가지 물건을 수행하는 데 사용할 수있는 모델과 같은 젠토 클래스를 확장하는 그렇다면, 함수 선언.

자원 모델 또는 모델 클래스 _construct()에서 테이블과 primary_key를 정의하기 위해 메소드를 정의해야합니다.

반면 __construct 는 PHP 의 기본 메소드 (모든 OO 언어에는 하나가 있음)이며 __construct객체를 인스턴스화 할 때마다 호출됩니다. 그게 다야

예:

Magento \ Framework \ Model \ ResourceModel \ AbstractResource

/**
 * Abstract resource model
 */
abstract class AbstractResource
{
    /**
     * Main constructor
     */
    public function __construct()
    {
        /**
         * Please override this one instead of overriding real __construct constructor
         */
        $this->_construct();
    } ...

마 젠토 \ 프레임 워크 \ 모델 \ 리소스 모델 \ Db \ AbstractDb

/**
 * Class constructor
 *
 * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
 * @param string $connectionName
 */
public function __construct(\Magento\Framework\Model\ResourceModel\Db\Context $context, $connectionName = null)
{
    $this->transactionManager = $context->getTransactionManager();
    $this->_resources = $context->getResources();
    $this->objectRelationProcessor = $context->getObjectRelationProcessor();
    if ($connectionName !== null) {
        $this->connectionName = $connectionName;
    }
    parent::__construct();
}

예를 들어 주시겠습니까?
zed Blackbeard

M2에서? 차이를보다 명확하게하기 위해 답을 개선 할 수 있지만, 예제가 필요한지
모르겠습니다

DI 및 __construct ()와 관련된 것에 대한 귀하의 의견에 관심이 있습니다. Magento2에서 소위 "DI 로직"은 안티 패턴으로 구현 된 것으로 보입니다. 실제로 타이트한 커플 링을 생성하기 때문입니다. 모듈과 함께 확장 한 타사 모듈 수에 따라 작성기 업데이트를 실행하면 종종 디버깅이 필요하고 생성자에 매개 변수를 추가하고 자식 클래스에서 실제로 사용되지 않는 응용 프로그램을 계속 실행하기 위해 매개 변수를 추가해야 할 수 있습니다. 그것이 "의존성 주입"이라고하더라도 확실하지 않지만 의존성 앵커링 또는 무언가 ...
someGuyOnTheWeb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.