인터셉터 클래스는 인터셉터 디자인 패턴 의 구현입니다 . 인터셉터는 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
클래스 를 통해 간접적으로 특정 이름 지정 패턴이 있는지 클래스를 스캔합니다. 클래스 이름이로 끝나면 Interceptor
Magento는 generateClass
이 클래스 의 메소드를 통해 인터셉터를 생성합니다.
vendor/magento/framework/Code/Generator.php
추적 할 추가 클래스 / 객체가 Magento\Framework\Code\Generator
있지만 독자를위한 연습으로 남겨 두겠습니다.