마 젠토 2 : var / generation의 인터셉터 파일은 무엇입니까?


24

그래서 일부 Interceptor.php파일을 발견 했습니다.var/generation

이 폴더에는 다음을 위해 생성 된 생성 된 클래스가 포함되어 있음을 알고 있습니다.

  • 공장
  • 프록시
  • 플러그인

인터셉터 파일이 플러그인 파일에 링크되어 있다고 가정하지만 때로는 파일 생성 방법을 얻지 못합니다. 예를 들어 내가 가지고 var/generation/Magento/Framework/App/Response/Http/Interceptor.php있지만이 파일은 기존 클래스와 일치하지 않는 것 같습니다.

그래서 Interceptor.php 파일 생성 방법에 대한 잘 설명 된 워크 플로를 찾고 있습니까?

답변:


32

인터셉터 클래스는 인터셉터 디자인 패턴 의 구현입니다 . 인터셉터는 Magento 2의 오브젝트 시스템플러그인 시스템을 구현하는 방법 입니다.

클라이언트 개발자로서 이론은 인터셉터에 대해 걱정할 필요가 없다는 것입니다. 개체 관리자에게 X 유형의 개체를 요청하면 반환됩니다. 요청한 객체는 인터셉터 일 수도 있고 아닐 수도 있지만 클라이언트 프로그래머의 관점에서는 인터셉터가 아닌 버전과 동일하게 동작합니다. 오브젝트 매니저가 구현 세부 사항에서 인터셉터를 리턴하거나 리턴하지 않기로 결정하는 방법

구현 세부 사항에 관심이있는 사람들을 위해 클래스 또는 해당 클래스의 상위 클래스에 플러그인이 구성된 경우 오브젝트 관리자는 인터셉터를 리턴합니다. 개발자 모드 인터셉터 클래스에서 볼 수 있습니다.

#File: vendor/magento/framework/Interception/ObjectManager/Config/Developer.php
public function getInstanceType($instanceName)
{
    $type = parent::getInstanceType($instanceName);
    if ($this->interceptionConfig && $this->interceptionConfig->hasPlugins($instanceName)
        && $this->interceptableValidator->validate($instanceName)
    ) {
        return $type . '\\Interceptor';
    }
    return $type;
}

프로덕션 (예 : 컴파일 모드)의 경우 Magento는 컴파일 모드에서 시스템을 사전 검색하고 플러그인이 필요한 클래스를 기록합니다.

실제 생성에 관해서는, Magento는 이것을 PHP 오토로더로 처리합니다. 개발자가 클래스를 인스턴스화하거나 클래스 이름 (타입 힌트, class_exists클래스 등) 으로 PHP 자동로드 이벤트를 트리거 하고 작성기 기반 자동 로더가 클래스 파일을 찾을 수없는 경우 두 번째로 등록 된 자동 로더

Magento\Framework\Code\Generator\Autoloader::load

트리거됩니다. 이 오토로더

vendor/magento/framework/Code/Generator/Autoloader.php

Magento\Framework\Code\Generator클래스 를 통해 간접적으로 특정 이름 지정 패턴이 있는지 클래스를 스캔합니다. 클래스 이름이로 끝나면 InterceptorMagento는 generateClass이 클래스 의 메소드를 통해 인터셉터를 생성합니다.

vendor/magento/framework/Code/Generator.php

추적 할 추가 클래스 / 객체가 Magento\Framework\Code\Generator있지만 독자를위한 연습으로 남겨 두겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.