Comment corriger les avertissements / erreurs soulevés par le rapport d'examen technique de Magento Marketplace?


25

Avec le nouveau Magento Marketplace, une extension soumise passe par plusieurs états de validation afin d'être approuvée et disponible via le Marketplace.

L'un d'eux est l'examen technique, à partir duquel vous pouvez obtenir un rapport technique comme suit:

Rapport technique du marché

Comme vous pouvez le voir, plus de 200 avertissements m'ont un peu effrayé, y a-t-il une ressource pour aider à corriger chaque avertissement en dehors de la liste disponible dans les documents: http://docs.magento.com/marketplace/user_guide/extensions/ review-code-validation.html ?


Je pense que quelqu'un devrait suggérer ici d'utiliser PHP CodeSniffer et quel que soit le standard utilisé par Magento 2 ... PSR-2? Sûrement!?
Robbie Averill

Il utilise à la fois PSR-1 et PSR-2.
Manish


Réponses:


31

Après une heure à parcourir le rapport, j'ai trouvé la liste suivante, cela pourrait être utile pour tout le monde, je pense.

J'essaierai de le garder à jour dès que je trouverai d'autres avertissements / erreurs:

Avertissements

La ligne dépasse 80 caractères; contient X caractères

Ou

La ligne dépasse la limite maximale de 100 caractères; contient X caractères

Ceux-là sont ceux que j'ai vus le plus, ils sont explicites, c'est une bonne pratique de garder les lignes de codage petites afin de garder un code propre et lisible.

Aucun espace trouvé après une virgule dans l'appel de fonction

Vous avez appelé une fonction qui reçoit des paramètres et n'ajoutez pas d'espace après la virgule. Exemple: strrchr($bla,".")devrait êtrestrrchr($bla, ".")

Attendu \ "tandis que (...) {\ n \"; trouvé \ "tandis que (...) \ n {\ n \"

\ "Foreach (...) {\ n \" attendu; trouvé \ "pour chaque (...) \ n {\ n \"

Attendu \ "si (...) {\ n \"; trouvé \ "si (...) \ n {\ n \"

Attendu \ "} else {\ n \"; trouvé \ "} \ n sinon {\ n \"

Cela signifie que vous avez renvoyé une ligne avant la parenthèse ouvrante de ces instructions PHP.

Exemple d'une mauvaise syntaxe avec une instruction if / else:

if (true)
{
}
else
{
}

Devrait être

if (true) {
} else {
}

La parenthèse fermante et l'accolade ouvrante d'une déclaration de fonction multiligne doivent être sur la même ligne

La plupart du temps, cela se produit dans le constructeur où vous déclarez quelque chose comme ceci:

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

Attendu qu'il devrait être:

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

Le caractère de fin de ligne n'est pas valide; attendu \ "\ n \" mais trouvé \ "\ r \ n \"

Cela se produit la plupart du temps au début du fichier, cela est dû à la façon dont votre IDE code le caractère de retour.

La variable \ "votre_variable \" n'est pas au format de casquettes de chameau valide

Chaque variable doit utiliser le format des casquettes de chameau, donc $your_variabledevrait être$yourVariable

La variable \ "one2Three \" contient des nombres mais cela est déconseillé

Évitez d'utiliser des nombres dans vos variables

Les structures de contrôle en ligne ne sont pas autorisées

Vous ne devez pas utiliser de structures de contrôle en ligne telles que:

else $test = true;

Tu devrais utiliser:

else {
    $test = true;
}

L'accolade ouvrante d'une classe doit être sur la ligne après la définition

Vous avez renvoyé une ligne lors de la déclaration d'une classe:

class Test
{

Vous devez garder l'accolade d'ouverture sur la même ligne:

class Test {

La variable de membre privé \ "votreVariable \" doit contenir un trait de soulignement de tête

La variable membre protégée \ "yourVariable \" doit contenir un trait de soulignement de tête

Vous devez ajouter un trait de soulignement à vos variables membres protégées et privées: $_yourVariable

Contrairement à ces deux, si vous ajoutez un trait de soulignement dans votre variable publique, vous pouvez obtenir:

La variable de membre public \ "_ yourVariable \" ne doit pas contenir de trait de soulignement de début.

Le paramètre de méthode $ bla n'est jamais utilisé

Vous avez passé un paramètre à une méthode mais vous ne l'utilisez jamais.

La déclaration de fonction multiligne n'est pas mise en retrait correctement; attendait 8 espaces mais a trouvé X

Vous avez ajouté trop d'indentation à vos paramètres de déclaration de fonction:

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

Devrait être:

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

Détection d'une méthode inutile possible détectée

Vous remplacez une méthode sans ajouter de modifications, par exemple:

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

Charge de la méthode LSD () détectée dans la boucle

Vous utilisez la load()méthode à l'intérieur d'une boucle qui n'est pas recommandée et doit être évitée.

Votre code ressemble très probablement à ceci:

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

Si vous chargez un modèle dans une boucle, c'est en effet assez mauvais en termes de performances. Si vous avez seulement besoin de récupérer quelques attributs, vous devez utiliser des collections à la place.

La complexité cyclomatique de la fonction (X) dépasse 10; envisager de refactoriser la fonction

Si vous n'êtes pas familier avec la complexité cyclomatique, je vous suggère de lire ce post: https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html . Cet avertissement signifie essentiellement qu'il y a trop de boucles et de conditions dans votre fonction.

L'instanciation directe d'objets est découragée dans Magento 2

Cela est dû au fait que vous instanciez directement un objet en appelant la classe, par exemple:

new \Zend_Filter_LocalizedToNormalized

Vous devez utiliser l'injection de dépendance ou un dernier recours, le gestionnaire d'objets.

Les commentaires se réfèrent à une tâche TODO

L'un de vos commentaires contient le @TODOdrapeau suivant .

Évitez les déclarations IF qui sont toujours vraies ou fausses

Vous avez créé une condition qui semble toujours vraie ou fausse.

Par exemple:

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

les erreurs

L'espace de noms pour la classe \ "Class \" n'est pas spécifié.

Vous manquez la use Path\To\Class;déclaration au début de votre classe.


1
Si j'ai bien compris, ces recommandations se réfèrent à toutes les extensions M2 (même pour un usage personnel)?
Siarhey Uchukhlebau

@SiarheyUchukhlebau oui, c'est le rapport technique que vous obtenez une fois que vous téléchargez une extension sur la place de marché Magento
Raphael at Digital Pianism

1
You should keep the opening brace on the same line:n'est-ce pas l'inverse? Great post by the way
Claudiu Creanga

@ClaudiuCreanga Je pense que vous avez raison, laissez-moi vérifier;)
Raphael au Digital Pianism

Est-il possible de transmettre une extension contenant plus de 10 000 messages d'avertissement? Ou ils rejettent tout ce qui a des avertissements?
Roland Soós

9

L'utilisation de Codesniffer avec l'ensemble de règles MEQP1 ou MEQP2 (selon votre version de Magento) vous donnera une idée de l'ensemble de règles Magento: https://github.com/magento/marketplace-eqp/tree/master/

Cet ensemble de règles et celui qui s'exécute sur le processus de soumission de Marketplace ne sont pas toujours parfaitement synchronisés (bien que ce soit bien sûr l'idéal), vous pouvez donc être rejeté pour les erreurs codesniffer même s'il passe la dernière version sur Github.

Certaines des erreurs "gravité-10" les plus courantes (les seules erreurs pour lesquelles votre extension sera rejetée), et leurs recommandations répertoriées, incluent:

Une balise de fermeture n'est pas autorisée à la fin d'un fichier PHP

Recommandation: supprimez la balise de fermeture PHP.

Les appels passés par référence de temps d'appel sont interdits

Recommandation: lisez la documentation sur les références en PHP 5 et refactorisez votre code. Références: http://php.net/manual/en/language.references.pass.php

Utilisation directe de $ _ENV Superglobal détectée.

Utilisation directe de $ _GET Superglobal détectée.

Utilisation directe de $ _POST Superglobal détectée.

Utilisation directe de $ _REQUEST Superglobal détectée.

Utilisation directe de $ _SESSION Superglobal détectée.

Utilisation directe de $ GLOBALS Superglobal détectée.

Recommandation: utilisez les objets wrapper correspondants afin d'obtenir des données de cookie, de session ou de demande.

La fonction set_magic_quotes_runtime () est déconseillée

Recommandation: les fonctions obsolètes ne doivent pas être utilisées car elles peuvent être supprimées à tout moment d'une future version. [Probablement une erreur générique pour toutes les dépréciations]

L'opérateur identique === n'est pas utilisé pour tester la valeur de retour de la fonction strpos

L'opérateur identique === n'est pas utilisé pour tester la valeur de retour de la fonction stripos

Recommandation: utilisez l'opérateur === pour tester la valeur de retour de cette fonction.

Utilisation incorrecte de la constante de chaîne de guillemets inversés. Les guillemets arrière doivent toujours être à l'intérieur des chaînes.

Recommandation: [pas de recommandation distincte. J'imagine que celui-ci est d'empêcher l'exec par des guillemets.]

Manque la méthode ACL _isAllowed () dans la classe [ClassName].

Recommandation: gérez très soigneusement la définition, la gestion et la gestion des privilèges. La ressource ACL doit être définie dans le fichier adminhtml.xml pour chaque contrôleur adminhtml et la méthode _isAllowed () doit être implémentée.

L'espace de noms pour la classe [ExceptionClassName] n'est pas spécifié.

Recommandation: spécifiez l'espace de noms d'exception.

Erreur de syntaxe PHP: la référence de passage par appel a été supprimée

Recommandation: correction d'une erreur de syntaxe. [Celui-ci accompagne ce qui précède. J'imagine qu'une erreur générique similaire est donnée pour toutes les autres erreurs de syntaxe PHP]

Violation possible de la conception de Magento 2. Construction typique de Magento 1 détectée.

Recommandation: [Cela ne contient aucune recommandation, mais décrit le code où l'utilisation de classe comme Mage :: blah ou Mage_blah_blah :: blah est détectée - ce sont des classes qui n'existent que dans Magento 1 et ne fonctionneront pas dans Magento 2. Une bonne idée est de recherchez dans votre extension M2 le regex Mage(\b|_)pour pré-vérifier les utilisations M1.]

ressource est un mot réservé en PHP 7.

Recommandation: [Pas de recommandation distincte. Renommer simplement le mot à quelque chose d'autre devrait fonctionner. J'imagine que cette erreur existe pour tous les mots réservés.]

La balise PHP d'ouverture doit être le premier contenu du fichier

Recommandation: supprimez tous les caractères avant la balise d'ouverture PHP.

L'utilisation de la construction du langage est déconseillée.

L'utilisation de la construction du langage de sortie est déconseillée.

Recommandation: la méthode d'objet de réponse setBody () doit être utilisée.

L'utilisation de la construction du langage d'écho est déconseillée.

L'utilisation de la construction du langage d'impression est déconseillée.

Recommandation: L'architecture de l'extension doit être modifiée afin d'éviter l'utilisation de l'écho, de l'en-tête, etc. dans les classes, pensez à utiliser la méthode setBody () de l'objet de réponse.

L'utilisation de eval () est déconseillée

Recommandation: évitez d'utiliser eval ().


Contrairement à ces erreurs, qui provoquent le rejet de votre extension, les avertissements sont actuellement répertoriés uniquement à titre de courtoisie, pour aider à améliorer le code de votre extension. Vous ne serez PAS rejeté de l'examen technique pour les avertissements, aussi nombreux soient-ils.

Bien sûr, cette règle pourrait être resserrée à l'avenir, et l'ensemble de règles codesniffer est constamment révisé, donc voir combien d'avertissements vous pouvez résoudre est toujours un bon plan. Les avertissements peuvent également indiquer des problèmes systémiques avec votre base de code.


Certaines raisons de rejet de l'examen technique n'apparaissent pas actuellement sur le rapport en ligne et ne sont indiquées que dans l'e-mail.

Des choses comme les violations de copier-coller et les logiciels malveillants détectés n'auront que des messages affichés dans l'e-mail que vous recevrez vous informant que votre extension n'a pas été acceptée, alors lisez attentivement l'e-mail .

Une archive de ces e-mails n'est actuellement pas visible depuis le portail des développeurs, donc si vous les supprimez sans les lire, ou si vous les déposez dans le courrier indésirable, ils disparaissent.

Les examinateurs de niveau 1 de Magento mettent parfois des informations supplémentaires dans cet e-mail, soit simplement des choses utiles qu'ils pensaient que vous pourriez vouloir savoir, comme «cette clé de tableau« serveur »devrait probablement être« serveur »», ou les raisons de leur rejet et de leurs suggestions sur la façon de le résoudre rapidement, comme "Vous avez copié un fichier core Magento entier et vous avez juste changé le chemin de classe: vous pouvez le remplacer par un paramètre de préférence de classe à la place.", ou "Vous avez copié un fichier core Magento entier juste pour changer quelques fonctions publiques: vous pouvez utiliser des plugins pour cela à la place. "

Si vous ne les lisez pas et que vous ne regardez que le rapport codesniffer, vous pouvez finir par essayer de résoudre les mauvais problèmes.


Notez que le unescaped output detectedmessage ne doit PAS être esquivé à l'aide des commentaires @escapeNotVerifiedou @noEscape. Cela sera probablement interdit dans les futures versions de Magento. Utilisez plutôt l'un des éléments suivants:

  • Toute chaîne statique entre guillemets simples.
  • Une chaîne statique entre guillemets, sans variable en ligne.
  • [recommandé] Une valeur échappé avec l' une des méthodes d'évacuation de \Magento\Framework\View\Element\AbstractBlock( escapeHtml(), escapeUrl(), escapeQuote(), escapeXssInUrl()).
  • Une valeur convertie en un type numérique (au moins bool et int, peut-être d'autres?)
  • Tout appel de méthode avec le mot "html" dans le nom, comme printBannerHtml(). N'abusez pas de celui-ci! Assurez-vous que votre blahHtml()méthode échappe vraiment correctement à toutes les variables.

mon extension affiche un avertissement mais rien de ce qui précède, est-il possible que mon extension soit rejetée en raison d'un avertissement?
Sanjay Gohil

J'ai posté cela il y a quelque temps - il peut y en avoir de nouveaux ajoutés depuis. Lorsque vous vous connectez à votre compte de développeur, cliquez sur l'extension et affichez le journal des erreurs, quel est le message que vous voyez et à quel niveau s'agit-il d'erreurs? S'ils ne sont pas de gravité 10, vous pouvez être rejeté pour une autre raison. Que dit l'e-mail de rejet?
Dewi Morgan

6

Erreur:

Sortie non échappée détectée

Erreur dans le fichier .phtml

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

Vous criez utiliser:

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

Reportez-vous à la sécurité des modèles XSS pour http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templates


C'est un style de programmation extrêmement pauvre. Veuillez ne pas abuser des commandes @noEscapeet @escapeNotValidatedde cette manière: si vous le faites, elles seront probablement obsolètes, puis interdites par le système MEQP. Voir le bas de ma réponse pour un large éventail de meilleures façons d'échapper à vos données.
Dewi Morgan

1
@Dewi Morgan: Merci pour vos précieuses informations.
Sankar_k
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.