Magento2-setup:di:compile


12

私はいくつかのカスタムコードを使用してプロジェクトで作業しています...これは私たちの最初の「中」Magento 2プロジェクトなので、(ここにいるすべての人と同じように)毎日新しいことを学び、対処方法を変更する必要がありますこの新しいMagentoバージョン

この質問の理由は、コマンドについて尋ねることです setup:di:compile

私はMagento 2で初日からbin / magentoが「Magentoコンパイルコマンドを再実行してください」setup:upgradeというメッセージを表示するたびにbin / magentoが要求するので、これを使用しています

ええと...私はsetup:di:compileこのプロジェクトで実行中のブレーク製品ビューページを見つけましたが、完全にあいまいな致命的エラーが発生しました。私はそれをデバッグしてコード結果をテストし、結果をゼロにして一日中過ごしました

今日、そのコマンドを省略すると、プロダクションモードも、すべてが魅力のように機能することを発見しました

それで、問題は...そのsetup:di:compileコマンドは正確には何ですか?必要ですか?ちょうどお勧めですか?またはそれは実行する必要のないいくつかの非推奨のコマンドですか?

更新

一部のユーザーが要求したように、これは私が言及していた致命的なエラーです

PHPの致命的エラー:抽象クラスMagento \ Catalog \ Block \ Product \ View \ AbstractViewをインスタンス化できません*** / vendor / magento / framework / ObjectManager / Factory / AbstractFactory.phpの93行目

Magento \ Catalog \ Block \ Product \ View \ AbstractViewを使用してカスタムブロックを検索しましたが、レイアウトファイルでのみ見つかりました。ブロッククラスコンストラクターにはありません。

私が理解できないことは、Magentoがコンパイルされたコードでこの致命的なエラーをスローする理由ですが、コンパイルされたコードなしではチャームのように機能します


'setup:di:compile'が開発モードでも製品ビューエラーを引き起こすことを確認できますか?
2017

はい、両方のモードで致命的なエラーが発生します
Raul Sanchez

「完全にあいまいな致命的エラー」を投稿できますか?
paj 2017

エラーで質問を更新しました。ありがとう
Raul Sanchez

回答:


21

コマンドsetup:di:compileコマンドは、var/diMagento <2.2およびgenerated Magento> = 2.2のフォルダーの内容を生成します

Magentoによると、これは次の目的を果たします。

  • アプリケーションコードの生成(ファクトリー、プロキシーなど)
  • エリア構成の集約(つまり、エリアごとに最適化された依存性注入構成)
  • インターセプター生成(つまり、インターセプターの最適化されたコード生成)
  • インターセプトキャッシュの生成
  • リポジトリのコード生成(つまり、API用に生成されたコード)
  • サービスデータ属性の生成(つまり、データオブジェクトの生成された拡張クラス)

ソース(http://devdocs.magento.com/guides/v2.0/config-guide/cli/config-cli-subcommands-compiler.html

ただし、Magentoをプロダクションモードにしても、コンパイルしなくても実際に機能します。したがって、Magentoのドキュメントによると、これはより最適化の手順です(つまり、インターセプターの最適化されたコード生成)。

setup:di:compileコマンドにエラーがある場合、これは主にカスタムphpクラスのコンストラクターの1つにエラーがあるためです。


1
ありがとう!だから、それは完全にオプションです...ほんの1点なので、私にはより明確です。私たちの場合、setup:di:compileはエラーをスローしません。コマンドは問題なく終了します。コマンドが終了した後、製品ビューページで致命的なエラーが発生したときのサイトの閲覧時
Raul Sanchez

エラーを投稿できますか?それは物事をより明確にするでしょう。
チツェ2017

エラーで質問を更新しました。ありがとう
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の生成コード)

  • サービスデータ属性の生成(つまり、データオブジェクトの生成された拡張クラス)

どのコマンドをいつ実行する必要があるかについては、この回答を参照してください:https : //magento.stackexchange.com/a/184927/35758


ありがとう!だから、それは完全にオプションです...ほんの1点なので、私にはより明確です。私たちの場合、setup:di:compileはエラーをスローしません。コマンドは問題なく終了します。コマンドビューが終了した後、製品ビューのページで致命的なエラーが発生したときにサイトを閲覧するときです。コンパイルされたコードがうまく機能しない理由はよくわかりませんが、コンパイルすると致命的なエラーが発生します
Raul Sanchez

これは、親クラスの既存のオプションの依存関係の後にサブクラスが新しい依存関係を追加した場合に発生する可能性があります。これを修正するには、新しい必須パラメーターをオプションのパラメーターの上に移動します。
Patel王子、2017

2

Magentoは、di:compileコマンドを使用せずに、本番環境と開発環境で引き続き実行されます。必要に応じて実際にインターセプターをコンパイルし、generatedフォルダーに保存します。

動作しても、この手順をスキップする必要はありません。実際、これが実行されると、magentoは重複したインジェクション、依存関係ループ、およびサイトをより安定させ、クラッシュや!dieを起こしにくくするその他の基本的なステップもチェックします。

そのエラーは、コンストラクターの引数が間違っているためにMagentoがコンパイルできないクラスを使用していることが原因であると私は強く信じています。

あなたが投稿したエラーはかなり曖昧ですが、クラスを拡張するAbstractViewクラスがあると思います。99%は、カスタムモジュールのどこかに、正しい引数をparent::__construct()メソッドに渡さないブロックです。したがって、インスタンス化すると失敗します。

すべてのブロックがAbstractViewクラスを拡張するため、xdebugon を指定してコンパイルコマンドを実行し、スタックトレースを見てログを設定して、失敗する前に最後に呼び出されたクラスを確認する必要があることに注意してください。

サイトがそのエラーなしで実行されるという事実は、実際にはページのどこでも破損したブロックを使用していないことを意味しますが、Magentoはコマンドの実行時にそれをコンパイルしようとするため、失敗します。compile


このような古い質問と他の検証済みの回答に時間を割いていただき、ありがとうございます...実際、私はカスタムレイアウトの間違ったブロックを修正して解決しました
Raul Sanchez
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.