마 젠토 2-설정 : 디 : 컴파일


12

나는 약간의 커스텀 코드로 프로젝트를 진행하고있다. 이것은 우리의 첫 번째 "중간"Magento 2 프로젝트이다. 그래서 우리는 매일 새로운 것을 배우고, 처리 방식을 바꿔야한다. 이 새로운 마 젠토 버전으로

이 질문의 이유는 명령에 대해 묻는 것입니다 setup:di:compile

bin / magento에서 매번 요청한대로 "Magento 컴파일 명령을 다시 실행하십시오"라는setup:upgrade 메시지 와 함께 Magento 2와 함께 첫날부터 사용했습니다.

글쎄 ... setup:di:compile이 프로젝트에서 제품보기 페이지가 완전히 모호한 치명적 오류와 함께 실행되는 것을 발견했습니다 . 디버깅을 시도하고 결과가 전혀없는 코드 변경으로 테스트하는 데 전체 작업 일을 보냈습니다.

오늘, 나는 그 명령을 생략하면 생산 모드에서도 모든 것이 매력처럼 작동한다는 것을 발견했습니다.

문제는 ... 그 setup:di:compile명령이 정확히 무엇 입니까? 필요합니까? 방금 추천 했습니까? 또는 더 이상 사용되지 않는 명령이며 실행할 필요가 없습니까?

최신 정보

일부 사용자가 요구했듯이 이것은 내가 언급 한 치명적인 오류입니다.

PHP 치명적 오류 : 93 행의 *** / vendor / magento / framework / ObjectManager / Factory / AbstractFactory.php에서 추상 클래스 Magento \ Catalog \ Block \ Product \ View \ AbstractView를 인스턴스화 할 수 없습니다.

Magento \ Catalog \ Block \ Product \ View \ AbstractView를 사용하여 사용자 정의 블록을 검색했지만 레이아웃 파일에서만 찾았으며 블록 클래스 생성자에는 없습니다.

이해할 수없는 것은 Magento가 컴파일 된 코드 로이 치명적 오류를 발생시키는 이유는 있지만 컴파일 된 코드가없는 매력처럼 작동합니다.


개발 모드에서도 'setup : di : compile'로 인해 제품보기 오류가 발생했음을 확인할 수 있습니까?
paj

예, 치명적 오류는 두 모드에서 모두 발생합니다
Raul Sanchez

"완전히 모호한 치명적 오류"를 게시 할 수 있습니까?
paj

질문을 오류로 업데이트했습니다. 감사합니다
Raul Sanchez

답변:


21

명령 setup:di:compile명령 var/di은 Magento <2.2 및 generated Magento> = 2.2 의 폴더 내용을 생성합니다.

마 젠토에 따르면 이것은 다음과 같은 목적에 사용됩니다.

  • 응용 프로그램 코드 생성 (공장, 프록시 등)
  • 영역 구성 집계 (영역 당 최적화 된 종속성 주입 구성)
  • 인터셉터 생성 (즉, 인터셉터의 최적화 된 코드 생성)
  • 차단 캐시 생성
  • 리포지토리 코드 생성 (즉, API에 대해 생성 된 코드)
  • 서비스 데이터 속성 생성 (즉, 데이터 오브젝트에 대해 생성 된 확장 클래스)

소스 ( http://devdocs.magento.com/guides/v2.0/config-guide/cli/config-cli-subcommands-compiler.html )

그러나 Magento를 프로덕션 모드로 배치하면 컴파일하지 않아도 실제로 작동합니다. Magento 문서에 따르면 이것은 최적화 단계 (즉, 인터셉터의 최적화 된 코드 생성)입니다

우리가 setup:di:compile명령에 오류가있을 때 , 이것은 대부분 커스텀 PHP 클래스의 생성자 중 하나의 오류 때문입니다.


1
감사! 그래서, 그것은 완전히 선택 사항입니다 ... 한 점만이므로 더 명확합니다. 이 경우 setup : di : compile에서 오류가 발생하지 않고 명령이 정상적으로 종료됩니다. 제품보기 페이지에서 치명적 오류가 발생한 경우 명령이 완료된 후 사이트를 탐색 할 때
Raul Sanchez

어쩌면 오류를 게시 할 수 있습니까? 그것은 더 분명하게 할 것입니다.
Tjitse

질문을 오류로 업데이트했습니다. 감사합니다
Raul Sanchez

12

setup:di:compile매번 명령을 반드시 실행해야하는 것은 아니지만 팩토리 메소드, 프록시, 플러그인 추가 또는 코드 컴파일을 사용하여 코드를 변경 한 경우이 명령을 실행해야합니다.

자세한 내용은

magento setup:di:compile필요한 파일을 생성합니다. 두 옵션 모두 MAGENTO_ROOT/var/generation directory(또는 /generatedMagento 2.2 이상인 경우) 클래스를 생성 합니다.

어떤 클래스가 생성됩니까?

  1. 공장
  2. 프록시
  3. 플러그인

공장

팩토리는 자동으로 주입 할 수없는 객체를 인스턴스화하는 데 사용됩니다. 예를 들어, 제품 개체를 데이터베이스에서로드해야하지만 종속성 주입 컨테이너에이 개체를 만들기위한 정보가 충분하지 않습니다. 그래서 우리는 공장을 사용합니다.

프록시

Magento 2는 모든 의존성이 필요한 생성자 주입을 사용합니다. 모든 종속성을 전달하지 않고 객체를 인스턴스화 할 수는 없습니다. 선택적인 의존성을 가지려면 어떻게해야합니까? 이것이 프록시가 존재하는 이유입니다.

플러그인 (인터셉터)

간단히 말해서, 플러그인은 Magento 2의 기본 사용자 지정 메커니즘입니다. 더 이상 클래스를 다시 쓰지 않아도됩니다. 그것은 당신이 응용 프로그램의 공개 방법 전후에 무언가를 연결하고 수행 할 수 있습니다.

setup : di : compile 명령을 실행하면 아래 작업이 수행됩니다.

코드 컴파일은 다음과 같은 순서로 구성됩니다.

  • 응용 프로그램 코드 생성 (공장, 프록시 등)

  • 영역 구성 집계 (영역 당 최적화 된 종속성 주입 구성)

  • 인터셉터 생성 (즉, 인터셉터의 최적화 된 코드 생성)

  • 차단 캐시 생성 리포지토리 코드 생성 (즉, API에 대해 생성 된 코드)

  • 서비스 데이터 속성 생성 (즉, 데이터 오브젝트에 대해 생성 된 확장 클래스)

/magento//a/184927/35758 명령을 실행해야 할 때이 답변을 참조하십시오.


감사! 그래서, 그것은 완전히 선택 사항입니다 ... 한 점만이므로 더 명확합니다. 이 경우 setup : di : compile에서 오류가 발생하지 않고 명령이 정상적으로 종료됩니다. 제품보기 페이지에서 명령이 완료된 후 치명적 오류가 발생했을 때 사이트를 탐색 할 때 컴파일 된 코드가 제대로 작동하지 않는 이유를 이해하지 못하지만 컴파일 할 때 치명적 오류가 발생합니다.
Raul Sanchez

하위 클래스가 부모 클래스의 기존 선택적 종속성 뒤에 새 종속성을 추가 한 경우 이런 일이 발생할 수 있습니다. 새로운 필수 매개 변수를 선택적 매개 변수 위로 이동하여이 문제를 해결할 수 있습니다.
왕자 Patel

2

Magento는 di : compile 명령 없이도 프로덕션 및 dev에서 계속 실행됩니다. 실제로 인터셉터를 컴파일하여 generated폴더에 저장 합니다.

작동한다고해서이 단계를 건너 뛰어야하는 것은 아닙니다! 실제로 이것이 실행되면 magento는 중복 주입, 의존성 루프 및 기타 기본 단계를 확인하여 사이트를보다 안정적으로 만들고 충돌 및 죽을 가능성을 줄입니다.

그 오류는 잘못된 생성자 인수로 인해 Magento가 컴파일 할 수없는 클래스를 사용했기 때문에 발생한다고 강력하게 믿습니다.

게시 한 오류는 매우 모호하지만 클래스를 확장하는 AbstractView클래스 가 있다고 생각합니다 .99 %는 사용자 정의 모듈의 어딘가에 블록으로 올바른 인수를 parent::__construct()메소드에 전달하지 않습니다 . 따라서 인스턴스화하면 실패합니다.

참고 것을 모두 당신이 컴파일 명령을 실행해야하므로 블록이 추상보기 클래스를 확장 xdebug에 그것이 실패하기 전에 클래스가 마지막으로 전화를 알기 위해 스택 추적에서보기에서 로그를 설정합니다.

이 오류없이 사이트가 실행된다는 사실은 실제로 페이지의 어느 곳에서든 손상된 블록을 사용 하고 있지 않다는 것을 의미 하지만 Magento는 명령을 실행할 때 여전히 블록을 컴파일하려고 시도 하므로 실패합니다.compile


다른 검증 된 답변으로 이와 같은 오래된 질문에 답변 할 시간을 내 주셔서 감사합니다 ... 사실, 나는 당신이 지적한 것처럼 사용자 정의 레이아웃에서 잘못된 블록을 수정 하여이 문제를 해결했습니다.
Raul Sanchez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.