Magento 2에서 팩토리 생성을 트리거하는 원인


39

Magento 2에는 미리 생성되거나 즉시 생성되는 많은 클래스 파일이 포함되어 있습니다. 그들은에 살고

var/generated

이러한 생성 된 파일에는 팩토리 클래스가 포함됩니다. 에서 문서 , 그것은 프로그래머가 인스턴스화 "비 주사"객체 팩토리 클래스를 사용하는 나의 이해이다. "주입 불가능"오브젝트는 일반적으로 인스턴스화하기 위해 사용자 입력이 필요하기 때문에 종속성 주입을 통해 추가 할 수없는 오브젝트입니다 __constructor.

문서에서 명확하지 않은 것은 Magento 2가 팩토리 클래스를 생성해야한다는 것을 어떻게 알 수 있는지입니다. 이 비트

런타임 모드 또는 컴파일러에서 객체 관리자가 존재하지 않는 팩토리를 발견하면 객체 관리자가 팩토리를 생성합니다.

객체 관리자 (또는 의존성 주입 __constructors)에서 팩토리 클래스를 사용하면 Magento 2가 나를 위해 생성하는 것처럼 들립니다. 그러나 객체 관리자는 내가 요청한 것이 공장이라는 것을 어떻게 알 수 있습니까?

또한 생성 된 모든 클래스를 자동으로 생성 (또는 "컴파일")하는 명령두 개 있는 것 같습니다 . 이러한 명령 중 하나를 실행하면 많은 팩토리 클래스가 생성됩니다. 필요한 팩토리 객체를 생성하기 위해 이러한 명령이보고있는 구성 및 / 또는 코드 파일은 무엇입니까?

객체 관리자 및 / 또는 명령 코드를 추적하면이 사실을 알 수 있지만 길고 힘든 여행을 피하고 싶습니다.

답변:


21

이 모든 것이 어떻게 작동하는지 흥미로운 코드 위치 : https://github.com/magento/magento2/blob/develop/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php#L40

다른 유형 여기에서 주로 오는 https://github.com/magento/magento2/tree/develop/lib/internal/Magento/Framework/ObjectManager/Code/Generator 여기에서도하지만 https://github.com/magento / magento2 / 트리 / 개발 / lib 디렉토리 / 내부 / 젠토 / 프레임 워크 / 차단 / 코드 / 발전기 차단 코드.

그것은 모두 여기에 자동 로더에 의해 트리거됩니다 https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Code/Generator/Autoloader.php#L32

public function load($className)
{
    if (!class_exists($className)) {
        return Generator::GENERATION_ERROR != $this->_generator->generateClass($className);
    }
    return true;
}

9

코드에서 팩토리가 생성되는 조건을 찾지 못했지만 팩토리 클래스는 요청되고 찾을 수 없을 때 생성됩니다.
일부 예약 키워드 Factory, Proxy, Interceptor가 사용되면 특정 클래스를 찾을 수 없을 때 코드 생성을 트리거합니다.
팩토리 생성을 트리거하는 코드를 찾 자마자 다시 게시하겠습니다.
따라서 클래스를 요청 Some\Namespace\HereFactory했는데 클래스가 존재하지 않는 경우 키워드로 끝나기 때문에 클래스 Factory에서 생성됩니다.var/generation/Some/Namespace/HereFactory.php


ObjectManager가 실제로 생성되지 않기 때문에 문서를 업데이트 해야하는 것처럼 보입니다. 특수 자동 로더가 답의 일부입니다. github.com/magento/magento2/blob/develop/lib/internal/Magento/…
Chris O'Toole

1
그것은 내 경험과 일치하지만 (gist.github.com/astorm/f245ce9c761c9a8053aa 참조) 질문 1을 발생시킵니다. 이것은 객체 관리자 코드에서 어디에서 발생합니까 (예 : 실제 규칙은 무엇입니까) 2. 컴파일러는 어떻게 / 발전기는 어떤 공장을 생성해야하는지 알고 있습니까?
Alan Storm

8

나는 지금 같은 완두콩 수프를 파고 있습니다. 내가 지금까지 이해 한 것은 자동 생성되는 모든 것들이에 /var/generation선언 된 환경 설정 및 인터페이스에서 수행 된다는 것입니다 app/etc/di.xml.

귀하의 인터페이스와 환경 설정이의 di.xml파일에 선언됩니다 /app/code/Vendor/<module>/etc/di.xml.

귀하의 인터페이스를 __constructor선언했으며 해당 di.xml파일 의 전역 또는 로컬로 해당 인터페이스에 대한 환경 설정을 선언 했기 때문에 객체를 생성하는 것을 알고 있습니다.

나는 내 의견과 함께 세 가지 곡물의 소금을 제공합니다.


유용한 정보는 +1이지만 팩토리는 di.xml파일이 아닌 다른 곳에서 온 것 같습니다. 팩토리에서 끝나는 객체 관리자로 무언가를 보내면 파일이 생성됩니다.
Alan Storm

도움이 되나요? bit.ly/1BOtdie
Steve Johnson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.