Wie behebe ich Warnungen / Fehler, die im technischen Überprüfungsbericht von Magento Marketplace angezeigt werden?

25

Mit dem neuen Magento Marketplace durchläuft eine eingereichte Erweiterung mehrere Validierungszustände, um über den Marketplace genehmigt und verfügbar zu werden.

Eine davon ist die technische Überprüfung, aus der Sie einen technischen Bericht wie den folgenden erhalten können:

Technischer Marktbericht

Wie Sie sehen können, haben mehr als 200 Warnungen mir verdammt noch mal Angst gemacht. Es gibt eine Möglichkeit, jede Warnung außer der in den Dokumenten verfügbaren Liste zu beheben: http://docs.magento.com/marketplace/user_guide/extensions/ review-code-validation.html ?

Raphael bei Digital Pianism
quelle
Ich habe das Gefühl, jemand sollte hier vorschlagen, PHP CodeSniffer zu verwenden, und was auch immer der Standard ist, dass Magento 2 ... PSR-2 verwendet? Sicherlich!?
Robbie Averill
Es werden sowohl PSR-1 als auch PSR-2 verwendet.
Manish
@ Raphael, pls sehen dies, magento.stackexchange.com/questions/192506/…
Abhishek
@raphael pls sehen dies: magento.stackexchange.com/questions/71399/...
abhishek

Antworten:

31

Nachdem ich den Bericht eine Stunde lang durchgearbeitet hatte, kam ich auf die folgende Liste, die für alle hilfreich sein könnte, die ich denke.

Ich werde versuchen, es auf dem neuesten Stand zu halten, sobald ich weitere Warnungen / Fehler finde:

Warnungen

Zeile überschreitet 80 Zeichen; enthält X Zeichen

Oder

Zeile überschreitet die maximale Länge von 100 Zeichen. enthält X Zeichen

Diejenigen, die ich am häufigsten gesehen habe, sind selbsterklärend. Es ist eine gute Praxis, die Codierungszeilen klein zu halten, um einen sauberen und lesbaren Code zu erhalten.

Kein Leerzeichen nach Komma im Funktionsaufruf gefunden

Sie haben eine Funktion aufgerufen, die Parameter empfängt und nach dem Komma kein Leerzeichen eingefügt hat. Beispiel: strrchr($bla,".")sollte seinstrrchr($bla, ".")

Erwartet "while (...) {\ n \"; "while (...) \ n {\ n \" gefunden

Erwartet "foreach (...) {\ n \"; \ "foreach (...) \ n {\ n \" gefunden

Erwartet "if (...) {\ n \"; gefunden \ "if (...) \ n {\ n \"

Erwartet \ "} else {\ n \"; \ "} \ n sonst {\ n \" gefunden

Das bedeutet, dass Sie eine Zeile vor der öffnenden Klammer dieser PHP-Anweisungen zurückgegeben haben.

Beispiel für eine falsche Syntax mit einer if / else-Anweisung:

if (true)
{
}
else
{
}

Sollte sein

if (true) {
} else {
}

Die schließende Klammer und die öffnende Klammer einer mehrzeiligen Funktionsdeklaration müssen sich in derselben Zeile befinden

Meistens passiert es in dem Konstruktor, in dem Sie so etwas deklarieren:

public function __construct(
    ProductFactory $productFactory,
    Test $test
)
{
}

Es sollte sein:

public function __construct(
    ProductFactory $productFactory,
    Test $test
) {
}

Zeilenendezeichen ist ungültig; erwartet \ "\ n \" aber gefunden \ "\ r \ n \"

Passiert die meiste Zeit am Anfang der Datei. Dies liegt an der Art und Weise, wie Ihre IDE das Rückgabezeichen codiert.

Die Variable "Ihre_Variable" hat kein gültiges Kamelkappenformat

Jede Variable muss das Kamelkappenformat verwenden, $your_variablesollte es also sein$yourVariable

Die Variable "one2Three" enthält Zahlen, aber davon wird abgeraten

Vermeiden Sie die Verwendung von Zahlen in Ihren Variablen

Inline-Kontrollstrukturen sind nicht erlaubt

Sie sollten keine Inline-Kontrollstrukturen verwenden, wie zum Beispiel:

else $test = true;

Du solltest benutzen:

else {
    $test = true;
}

Die öffnende Klammer einer Klasse muss sich in der Zeile nach der Definition befinden

Sie haben beim Deklarieren einer Klasse eine Zeile zurückgegeben:

class Test
{

Sie sollten die öffnende Klammer in derselben Zeile belassen:

class Test {

Die private Mitgliedsvariable "yourVariable" muss einen führenden Unterstrich enthalten

Die geschützte Mitgliedsvariable "yourVariable" muss einen führenden Unterstrich enthalten

Sie sollten Ihren geschützten und privaten Mitgliedsvariablen einen führenden Unterstrich hinzufügen: $_yourVariable

Im Gegensatz zu diesen beiden können Sie Folgendes erhalten, wenn Sie einen Unterstrich in Ihre öffentliche Variable einfügen:

Die öffentliche Mitgliedsvariable "_ yourVariable" darf keinen führenden Unterstrich enthalten.

Der Methodenparameter $ bla wird nie verwendet

Sie haben einen Parameter an eine Methode übergeben, verwenden ihn jedoch nie.

Mehrzeilige Funktionsdeklaration nicht richtig eingerückt; 8 Leerzeichen erwartet, aber X gefunden

Sie haben Ihren Funktionsdeklarationsparametern zu viele Einrückungen hinzugefügt:

public function __construct(ProductRepository $productRepository,
                            ListsInterface $listsInterface,
                            Data $helper
) {

Sollte sein:

public function __construct(ProductRepository $productRepository,
    ListsInterface $listsInterface,
    Data $helper
) {

Möglicherweise unbrauchbares Überschreiben der Methode erkannt

Sie überschreiben eine Methode, ohne Änderungen hinzuzufügen. Beispiel:

public function __construct(Context $context) {
    parent::__construct($context);
}

Modell LSD-Methode load () in Schleife erkannt

Sie verwenden die load()Methode in einer Schleife, die nicht empfohlen wird und vermieden werden muss.

Höchstwahrscheinlich sieht Ihr Code so aus:

foreach(...) {
    $model->load();
}

Wenn Sie ein Modell in eine Schleife laden, ist die Leistung in der Tat ziemlich schlecht. Wenn Sie nur einige Attribute abrufen müssen, sollten Sie stattdessen Sammlungen verwenden.

Die zyklomatische Komplexität (X) der Funktion überschreitet 10; Überlegen Sie, ob Sie die Funktion überarbeiten möchten

Wenn Sie mit der zyklomatischen Komplexität nicht vertraut sind, empfehlen wir Ihnen, diesen Beitrag zu lesen: https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html . Diese Warnung bedeutet im Grunde, dass Ihre Funktion zu viele Schleifen und Bedingungen enthält.

Direkte Objektinstanziierung wird in Magento 2 nicht empfohlen

Dies wird dadurch verursacht, dass Sie ein Objekt direkt instanziieren, indem Sie die Klasse aufrufen. Beispiel:

new \Zend_Filter_LocalizedToNormalized

Verwenden Sie die Abhängigkeitsinjektion oder einen letzten Ausweg, den Objektmanager.

Kommentare beziehen sich auf eine TODO-Aufgabe

Einer Ihrer Kommentare enthält die folgende @TODOFlagge.

Vermeiden Sie IF-Anweisungen, die immer wahr oder falsch sind

Sie haben eine Bedingung erstellt, die immer wahr oder falsch zu sein scheint.

Beispielsweise:

$variable = "6";
...
// More code that doesn't change $variable
...
if ($variable)

Fehler

Der Namespace für die Klasse "Class" ist nicht angegeben.

Sie vermissen die use Path\To\Class;Aussage zu Beginn Ihrer Klasse.

Raphael bei Digital Pianism
quelle
1
Wenn ich das richtig verstanden habe, beziehen sich diese Empfehlungen auf alle M2-Erweiterungen (auch für den persönlichen Gebrauch)?
Siarhey Uchukhlebau
@SiarheyUchukhlebau Ja, das ist der technische Bericht, den Sie erhalten, wenn Sie eine Erweiterung auf den Magento Marketplace hochladen
Raphael at Digital Pianism
1
You should keep the opening brace on the same line:ist es nicht umgekehrt? Toller Beitrag übrigens
Claudiu Creanga
@ClaudiuCreanga Ich denke, du hast Recht, lass mich noch einmal
nachsehen
Ist es möglich, eine Nebenstelle durchzuschalten, die mehr als 10.000 Warnungen enthält? Oder lehnen sie alles ab, was Warnungen enthält?
Roland Soós
9

Durch die Verwendung von Codesniffer mit dem MEQP1- oder MEQP2-Regelsatz (abhängig von Ihrer Magento-Version) erhalten Sie eine Vorstellung vom Magento-Regelsatz: https://github.com/magento/marketplace-eqp/tree/master/

Dieser Regelsatz und der Regelsatz, der beim Einreichungsprozess von Marketplace ausgeführt wird, sind NICHT immer perfekt synchron (obwohl dies natürlich ideal ist), sodass Sie aufgrund von Fehlern mit unterschiedlichen Codes möglicherweise abgelehnt werden, selbst wenn die neueste Version von Github erfolgreich ist.

Einige der häufigsten "Schweregrad-10" -Fehler (die einzigen Fehler, aufgrund derer Ihre Erweiterung abgelehnt wird) und die darin aufgeführten Empfehlungen umfassen:

Ein schließendes Tag am Ende einer PHP-Datei ist nicht zulässig

Empfehlung: PHP Closing Tag entfernen.

Call-Time-Pass-by-Reference-Anrufe sind verboten

Empfehlung: Lesen Sie die Dokumentation zu Referenzen in PHP 5 und überarbeiten Sie Ihren Code. Referenzen: http://php.net/manual/en/language.references.pass.php

Direkte Verwendung von $ _ENV Superglobal erkannt.

Direkte Verwendung von $ _GET Superglobal erkannt.

Direkte Verwendung von $ _POST Superglobal erkannt.

Direkte Verwendung von $ _REQUEST Superglobal erkannt.

Direkte Verwendung von $ _SESSION Superglobal erkannt.

Direkte Verwendung von $ GLOBALS Superglobal erkannt.

Empfehlung: Verwenden Sie entsprechende Wrapper-Objekte, um Cookie-, Sitzungs- oder Anforderungsdaten abzurufen.

Die Funktion set_magic_quotes_runtime () ist veraltet

Empfehlung: Veraltete Funktionen sollten nicht verwendet werden, da sie zu irgendeinem Zeitpunkt aus einer zukünftigen Version entfernt werden können. [Wahrscheinlich ein generischer Fehler für alle Abschreibungen]

Der identische Operator === wird nicht zum Testen des Rückgabewerts der Funktion strpos verwendet

Der identische Operator === wird nicht zum Testen des Rückgabewerts der Stripos-Funktion verwendet

Empfehlung: Verwenden Sie den Operator ===, um den Rückgabewert dieser Funktion zu testen.

Falsche Verwendung der Konstante für die Back-Quote-Zeichenfolge. Anführungszeichen sollten immer in Zeichenketten stehen.

Empfehlung: [keine gesonderte Empfehlung. Ich stelle mir vor, dass dies dazu dient, Exec durch Backquotes zu verhindern.

Fehlende _isAllowed () - ACL-Methode in der Klasse [ClassName].

Empfehlung: Gehen Sie beim Festlegen, Verwalten und Behandeln von Berechtigungen sehr sorgfältig vor. Die ACL-Ressource sollte in der Datei adminhtml.xml für jeden Adminhtml-Controller definiert und die Methode _isAllowed () implementiert werden.

Der Namespace für die Klasse [ExceptionClassName] wurde nicht angegeben.

Empfehlung: Geben Sie den Exception-Namespace an.

PHP-Syntaxfehler: Die Pass-by-Reference für die Aufrufzeit wurde entfernt

Empfehlung: Syntaxfehler beheben. [Dieser begleitet das Obige. Ich stelle mir vor, dass ein ähnlicher generischer Fehler für alle anderen PHP-Syntaxfehler angegeben wird.]

Mögliche Magento 2-Designverletzung. Erkannte typische Magento 1-Konstruktion.

Empfehlung: [Dies enthält keine Empfehlung, beschreibt jedoch Code, bei dem die Verwendung von Klassen wie Mage :: blah oder Mage_blah_blah :: blah erkannt wird. Dies sind Klassen, die nur in Magento 1 vorhanden sind und in Magento 2 nicht funktionieren Durchsuchen Sie Ihre M2-Erweiterung nach dem regulären Ausdruck, Mage(\b|_)um vorab nach M1-Verwendungen zu suchen .]

resource ist in PHP 7 ein reserviertes Wort.

Empfehlung: [Keine separate Empfehlung. Es sollte funktionieren, das Wort einfach in etwas anderes umzubenennen. Ich stelle mir vor, dieser Fehler existiert für alle reservierten Wörter.]

Das öffnende PHP-Tag muss der erste Inhalt in der Datei sein

Empfehlung: Entfernen Sie alle Zeichen vor dem PHP Opening Tag.

Von der Verwendung des Sprachkonstrukts wird abgeraten.

Die Verwendung von Exit-Sprachkonstrukten wird nicht empfohlen.

Empfehlung: Die Antwortobjektmethode setBody () sollte verwendet werden.

Von der Verwendung eines Echosprachkonstrukts wird abgeraten.

Von der Verwendung des Druckersprachenkonstrukts wird abgeraten.

Empfehlung: Die Architektur der Erweiterung sollte geändert werden, um die Verwendung von Echo, Header usw. in Klassen zu vermeiden. Erwägen Sie die Verwendung der setBody () -Methode des Antwortobjekts.

Von der Verwendung von eval () wird abgeraten

Empfehlung: Vermeiden Sie eval ().


Im Gegensatz zu diesen Fehlern, die dazu führen, dass Ihre Erweiterung abgelehnt wird, werden Warnungen derzeit nur zur Information aufgeführt, um den Code Ihrer Erweiterung zu verbessern. Sie werden NICHT von der technischen Überprüfung wegen Warnungen abgelehnt, wie viele es auch geben mögen.

Natürlich kann diese Regel in Zukunft verschärft werden, und der Regelsatz für Codesniffer wird ständig überprüft. Daher ist es immer ein guter Plan, zu sehen, wie viele Warnungen Sie auflösen können. Die Warnungen können auch auf systembedingte Probleme mit Ihrer Codebasis hinweisen.


Einige Gründe für die Ablehnung der technischen Überprüfung erscheinen derzeit nicht im Online-Bericht und werden nur in der E-Mail angegeben.

Bei erkannten Verstößen gegen das Einfügen beim Kopieren und Malware werden in der E-Mail nur Nachrichten angezeigt, die Sie darüber informieren, dass Ihre Erweiterung nicht akzeptiert wurde. Lesen Sie die E-Mail daher sorgfältig durch .

Ein Archiv dieser E-Mails ist derzeit im Entwicklerportal nicht sichtbar. Wenn Sie sie also löschen, ohne sie zu lesen, oder als Junk-Archiv ablegen, sind sie verschwunden.

Magentos Prüfer der Stufe 1 geben manchmal zusätzliche Informationen in diese E-Mail ein, entweder nur hilfreiche Dinge, über die Sie vielleicht etwas wissen möchten, wie "dieser Array-Schlüssel" sever "sollte wahrscheinlich" server "sein", oder die Gründe für ihre Ablehnung und Vorschläge zum schnellen Auflösen wie "Sie haben eine ganze Magento-Kerndatei kopiert und nur den Klassenpfad geändert: Sie können diesen stattdessen durch eine Klasseneinstellung ersetzen." oder "Sie haben eine ganze Magento-Kerndatei kopiert, um nur einige zu ändern." öffentliche Funktionen: Sie können stattdessen Plugins verwenden. "

Wenn Sie diese nicht lesen und sich nur den CodeNiffer-Bericht ansehen, versuchen Sie möglicherweise, die falschen Probleme zu beheben.


Beachten Sie, dass die unescaped output detectedNachricht NICHT mit den Kommentaren @escapeNotVerifiedoder @noEscapeausgewichen werden sollte. Dies wird wahrscheinlich in zukünftigen Versionen von Magento nicht mehr erlaubt sein. Verwenden Sie stattdessen eine der folgenden Optionen:

  • Beliebige statische Zeichenfolge in einfachen Anführungszeichen.
  • Eine statische Zeichenfolge in doppelten Anführungszeichen ohne Inline-Variablen.
  • [empfohlen] Ein Wert kam mit einer der Methoden aus escape \Magento\Framework\View\Element\AbstractBlock( escapeHtml(), escapeUrl(), escapeQuote(), escapeXssInUrl()).
  • Ein Wert, der in einen numerischen Typ umgewandelt wurde (mindestens bool und int, vielleicht andere?)
  • Jeder Methodenaufruf mit dem Wort "html" im Namen, wie printBannerHtml(). Missbrauche diesen nicht! Stellen Sie sicher, dass Ihre blahHtml()Methode wirklich alle Variablen korrekt maskiert.
Dewi Morgan
quelle
Meine Nebenstelle zeigt eine Warnung an, aber keine der oben genannten. Ist es möglich, dass meine Nebenstelle wegen einer Warnung abgelehnt wird?
Sanjay Gohil
Ich habe dies vor einiger Zeit gepostet - möglicherweise wurden seitdem neue hinzugefügt. Wenn Sie sich bei Ihrem Entwicklerkonto anmelden, klicken Sie auf die Erweiterung, und zeigen Sie das Fehlerprotokoll an. Welche Meldung wird angezeigt und auf welcher Ebene treten Fehler auf? Wenn dies nicht der Schweregrad 10 ist, werden Sie möglicherweise aus einem anderen Grund abgelehnt. Was steht in der Ablehnungs-E-Mail?
Dewi Morgan
6

Error:

Unescaped-Ausgabe erkannt

Fehler in der .phtml-Datei

<ul class="form-list" id="payment_form_<?php echo $code ?>" style="display:none;">

Sie schreien mit:

<ul class="form-list" id="payment_form_<?php /* @noEscape */ echo $code ?>" style="display:none;">

Informationen zur Sicherheit von Templates XSS finden Sie unter http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templates

Sankar_k
quelle
Dies ist ein außerordentlich schlechter Programmierstil. Bitte missbrauchen Sie die Befehle @noEscapeund nicht @escapeNotValidatedauf diese Weise: Andernfalls werden sie wahrscheinlich nicht mehr unterstützt und vom MEQP-System nicht mehr zugelassen. Am Ende meiner Antwort finden Sie eine Reihe von besseren Möglichkeiten, um Ihren Daten zu entkommen.
Dewi Morgan
1
@Dewi Morgan: Danke für deine wertvollen Informationen.
Sankar_k