마 젠토 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.