Ich habe in einem Projekt mit benutzerdefiniertem Code gearbeitet ... dies ist unser erstes "mittleres" Magento 2-Projekt, also lernen wir (wie alle Leute hier denke) jeden Tag neue Dinge und müssen die Art und Weise ändern, wie wir damit umgehen mit dieser neuen Magento-Version
Der Grund für diese Frage ist die Frage nach dem Befehl setup:di:compile
Ich benutze es seit dem ersten Tag mit Magento 2, da bin / magento nach jedem setup:upgrade
mit der Meldung "Bitte führen Sie den Magento-Kompilierungsbefehl erneut aus" danach fragt.
Nun ... Ich habe festgestellt, dass setup:di:compile
in diesem Projekt die Produktansichtseite für Pausen mit einem völlig mehrdeutigen schwerwiegenden Fehler ausgeführt wird. Ich habe ganze Arbeitstage damit verbracht, es zu debuggen und mit Codeänderungen ohne Ergebnis zu testen
Heute habe ich festgestellt, dass, wenn ich diesen Befehl weglasse, alles wie ein Zauber wirkt, auch im Produktionsmodus
Die Frage ist also ... was genau setup:di:compile
befiehlt dieser Befehl? Ist es erforderlich? Nur empfohlen? Oder ist es ein veralteter Befehl, der nicht ausgeführt werden muss?
AKTUALISIEREN
Wie einige Benutzer gefordert haben, ist dies der schwerwiegende Fehler, auf den ich verwiesen habe
Schwerwiegender PHP-Fehler: Die abstrakte Klasse Magento \ Catalog \ Block \ Product \ View \ AbstractView in *** / vendor / magento / framework / ObjectManager / Factory / AbstractFactory.php in Zeile 93 kann nicht instanziiert werden
Ich habe mit Magento \ Catalog \ Block \ Product \ View \ AbstractView nach einem benutzerdefinierten Block gesucht, aber ich habe ihn nur in Layoutdateien gefunden. Er ist in keinem Blockklassenkonstruktor vorhanden
Was ich nicht verstehen kann ist: Warum Magento diesen schwerwiegenden Fehler mit kompiliertem Code auslöst, aber es funktioniert wie ein Zauber ohne kompilierten Code
quelle
Antworten:
Der Befehl
setup:di:compile
befehl generiert den Inhalt desvar/di
Ordners in Magento <2.2 undgenerated
für Magento> = 2.2Laut Magento dient dies folgendem Zweck:
Quelle ( http://devdocs.magento.com/guides/v2.0/config-guide/cli/config-cli-subcommands-compiler.html )
Wenn Sie Magento jedoch in den Produktionsmodus versetzen, funktioniert es ohne Kompilierung tatsächlich immer noch. Laut Magento-Dokumenten ist dies also eher ein Optimierungsschritt ( dh eine optimierte Codegenerierung von Interceptors).
Wenn der
setup:di:compile
Befehl Fehler enthält , liegt dies hauptsächlich an Fehlern in einem der Konstruktoren benutzerdefinierter PHP-Klassen.quelle
Es ist nicht zwingend erforderlich, den
setup:di:compile
Befehl jedes Mal auszuführen. Wenn Sie jedoch Codeänderungen speziell mit Factory-Methoden, Proxy, Hinzufügen von Plugins oder einer Codekompilierung vorgenommen haben, müssen Sie diesen Befehl ausführen.magento setup:di:compile
um notwendige Dateien zu generieren. Beide Optionen führen zum Generieren von Klassen inMAGENTO_ROOT/var/generation directory
(oder/generated
wenn Magento 2.2+).Welche Klassen werden generiert?
Fabriken
Fabriken werden verwendet, um Objekte zu instanziieren, die nicht automatisch injiziert werden können. Beispielsweise muss ein Produktobjekt aus der Datenbank geladen werden, aber der Abhängigkeitsinjektionscontainer verfügt nicht über genügend Informationen, um dieses Objekt zu erstellen. Deshalb benutzen wir Fabriken.
Proxies
Magento 2 verwendet die Konstruktorinjektion, bei der alle Abhängigkeiten erforderlich sind. Sie können ein Objekt nicht instanziieren, ohne alle Abhängigkeiten zu übergeben. Was ist, wenn Sie optionale Abhängigkeiten haben möchten? Deshalb gibt es Proxies.
Plugins (Interceptors)
Einfach ausgedrückt, Plugins sind die primären Anpassungsmechanismen für Magento 2. Keine Klassenumschreibungen mehr. Sie können sich vor, nach oder um eine öffentliche Methode der Anwendung anschließen und etwas tun.
Wenn Sie den Befehl setup: di: compile ausführen, wird Folgendes ausgeführt
Die Codekompilierung besteht aus allen folgenden Elementen in keiner bestimmten Reihenfolge:
Generierung von Anwendungscode (Fabriken, Proxys usw.)
Bereichskonfigurationsaggregation (dh optimierte Abhängigkeitsinjektionskonfigurationen pro Bereich)
Interceptor-Generierung (dh optimierte Code-Generierung von Interceptors)
Generierung des Interception-Cache Regeneritories-Codegenerierung (dh generierter Code für APIs)
Generierung von Servicedatenattributen (dh generierte Erweiterungsklassen für Datenobjekte)
In dieser Antwort erfahren Sie, wann wir welche Befehle ausführen sollten: /magento//a/184927/35758
quelle
Magento wird weiterhin in Produktion und Entwicklung ohne den Befehl di: compile ausgeführt. Die Interceptors werden nach Bedarf kompiliert und im
generated
Ordner gespeichert .Selbst wenn es funktioniert, heißt das nicht, dass Sie diesen Schritt überspringen sollten! Wenn dies ausgeführt wird, sucht Magento auch nach doppelten Injektionen, Abhängigkeitsschleifen und anderen grundlegenden Schritten, die Ihre Site stabiler machen und weniger wahrscheinlich abstürzen und! Sterben.
Ich bin der festen Überzeugung, dass dieser Fehler auf die Verwendung einer Klasse zurückzuführen ist, die Magento aufgrund eines falschen Konstruktorarguments nicht kompilieren kann.
Der Fehler, den Sie gepostet haben, ist ziemlich vage, aber ich glaube, Sie haben eine Klasse, die die
AbstractView
Klasse erweitert. 99% ist ein Block irgendwo in Ihren benutzerdefinierten Modulen, der nicht die richtigen Argumente an dieparent::__construct()
Methode übergibt . Daher schlägt es fehl, wenn es instanziiert wird.Beachten Sie, dass alle Blöcke die AbstractView-Klasse erweitern, sodass Sie den Kompilierungsbefehl mit
xdebug
on ausführen und ein Protokoll für die Stapelverfolgung erstellen müssen, um festzustellen , welche Klasse sie zuletzt aufgerufen hat, bevor sie fehlgeschlagen ist.Die Tatsache , dass die Website läuft , ohne dass Fehler bedeuten , dass Sie nicht tatsächlich die Verwendung von beschädigtem Block überall auf Ihrer Seite, aber Magento noch versuchen , es zu kompilieren , wenn den Lauf
compile
Befehl, daher scheitert es.quelle