Come correggere gli avvisi / errori generati dal rapporto di revisione tecnica del mercato Magento?


25

Con il nuovo mercato Magento, un'estensione inviata passa attraverso diversi stati di convalida per essere approvata e disponibile tramite il mercato.

Uno di questi è la revisione tecnica, da cui è possibile ottenere un rapporto tecnico come il seguente:

Rapporto tecnico del mercato

Come puoi vedere, oltre 200 avvertimenti mi hanno spaventato a morte, c'è qualche risorsa per aiutare a correggere tutti gli avvisi oltre all'elenco disponibile nella documentazione: http://docs.magento.com/marketplace/user_guide/extensions/ review-code-validation.html ?


Sento che qualcuno dovrebbe suggerire qui usando PHP CodeSniffer e qualunque sia lo standard che Magento 2 usa ... PSR-2? Certamente!?
Robbie Averill,

Utilizza sia PSR-1 che PSR-2.
Manish,

@raphael, per favore vedi questo, magento.stackexchange.com/questions/192506/…
abhishek

Risposte:


31

Dopo un'ora che ho esaminato il rapporto, ho trovato il seguente elenco, potrebbe essere utile per tutti quelli che penso.

Cercherò di mantenerlo aggiornato non appena trovo più avvisi / errori:

Avvertenze

La riga supera 80 caratteri; contiene X caratteri

O

La linea supera il limite massimo di 100 caratteri; contiene X caratteri

Quelli sono quelli che ho visto di più, sono autoesplicativi, è una buona pratica mantenere piccole le linee di codifica per mantenere un codice pulito e leggibile.

Nessuno spazio trovato dopo la virgola nella chiamata di funzione

Hai chiamato una funzione che riceve parametri e non ha aggiunto uno spazio dopo la virgola. Esempio: strrchr($bla,".")dovrebbe esserestrrchr($bla, ".")

Previsto \ "while (...) {\ n \"; trovato \ "while (...) \ n {\ n \"

Previsto \ "foreach (...) {\ n \"; trovato \ "foreach (...) \ n {\ n \"

Previsto \ "if (...) {\ n \"; trovato \ "if (...) \ n {\ n \"

Previsto \ "} altrimenti {\ n \"; trovato \ "} \ n altro {\ n \"

Ciò significa che hai restituito una riga prima della parentesi aperta di quelle istruzioni PHP.

Esempio di sintassi errata con un'istruzione if / else:

if (true)
{
}
else
{
}

Dovrebbe essere

if (true) {
} else {
}

La parentesi di chiusura e il controvento di apertura di una dichiarazione di funzione multilinea devono essere sulla stessa riga

Il più delle volte, succede nel costruttore in cui dichiari qualcosa del genere:

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

Considerando che dovrebbe essere:

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

Il carattere di fine riga non è valido; previsto \ "\ n \" ma trovato \ "\ r \ n \"

Succede il più delle volte all'inizio del file, è causato dal modo in cui l'IDE codifica il carattere restituito.

La variabile \ "variabile_variata" non è in un formato di cappucci cammello valido

Ogni variabile deve utilizzare il formato dei cappucci cammello, quindi $your_variabledovrebbe essere$yourVariable

La variabile \ "one2Three \" contiene numeri ma questo è scoraggiato

Evita di usare numeri nelle tue variabili

Le strutture di controllo in linea non sono consentite

Non dovresti usare strutture di controllo in linea come:

else $test = true;

Dovresti usare:

else {
    $test = true;
}

Il controvento di apertura di una classe deve essere sulla riga dopo la definizione

Hai restituito una riga quando dichiari una classe:

class Test
{

Dovresti mantenere la parentesi graffa di apertura sulla stessa riga:

class Test {

La variabile del membro privato \ "yourVariable \" deve contenere un carattere di sottolineatura iniziale

La variabile membro protetta \ "yourVariable \" deve contenere un carattere di sottolineatura iniziale

È necessario aggiungere un carattere di sottolineatura iniziale alle variabili dei membri privati ​​e protetti: $_yourVariable

Al contrario di questi due, se aggiungi un trattino basso nella tua variabile pubblica puoi ottenere:

La variabile del membro pubblico \ "_ yourVariable \" non deve contenere un carattere di sottolineatura iniziale.

Il parametro del metodo $ bla non viene mai utilizzato

Hai passato un parametro a un metodo ma non lo usi mai.

Dichiarazione di funzione multilinea non rientrata correttamente; previsti 8 spazi ma trovato X

Hai aggiunto troppa indentazione ai parametri della tua dichiarazione di funzione:

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

Dovrebbe essere:

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

Rilevato possibile metodo inutile ignorato

Stai eseguendo l'override di un metodo senza aggiungere modifiche, ad esempio:

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

Carico del metodo LSD modello () rilevato in loop

Stai usando il load()metodo all'interno di un ciclo che non è raccomandato e deve essere evitato.

Molto probabilmente il tuo codice è simile al seguente:

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

Se stai caricando un modello in un ciclo è davvero piuttosto male in termini di prestazioni. Se hai solo bisogno di recuperare alcuni attributi, dovresti usare invece le raccolte.

La complessità ciclomatica (X) della funzione supera 10; considerare il refactoring della funzione

Se non hai familiarità con la complessità ciclomatica, ti suggerisco di leggere in questo post: https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html . Questo avviso in sostanza significa che ci sono troppi loop e condizioni nella funzione.

La creazione di istanze di oggetti diretti è scoraggiante in Magento 2

È causato dal fatto che stai istanziando un oggetto direttamente chiamando la classe, ad esempio:

new \Zend_Filter_LocalizedToNormalized

È necessario utilizzare l'iniezione delle dipendenze o un'ultima risorsa, il gestore oggetti.

I commenti si riferiscono a un'attività TODO

Uno dei tuoi commenti contiene il seguente @TODOflag.

Evita le dichiarazioni IF che sono sempre vere o false

Hai creato una condizione che sembra essere sempre vera o falsa.

Per esempio:

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

Errori

Lo spazio dei nomi per la classe \ "Class \" non è specificato.

Manca la use Path\To\Class;dichiarazione all'inizio della lezione.


1
Nel caso in cui ho capito bene, queste raccomandazioni si riferiscono a tutte le estensioni M2 (anche per uso personale)?
Siarhey Uchukhlebau,

@SiarheyUchukhlebau sì, questo è il rapporto tecnico che ricevi una volta caricata un'estensione sul mercato Magento
Raffaello al Pianismo digitale,

1
You should keep the opening brace on the same line:non è il contrario? Ottimo post tra l'altro
Claudiu Creanga,

@ClaudiuCreanga Penso che tu abbia ragione fammi ricontrollare;)
Raffaello al Pianismo Digitale,

È possibile passare attraverso un'estensione che contiene più di 10k messaggi di avviso? O rifiutano tutto ciò che ha avvertimenti?
Roland Soós,

9

L'uso di Codesniffer con il set di regole MEQP1 o MEQP2 (a seconda della versione di Magento) ti darà un'idea del set di regole Magento: https://github.com/magento/marketplace-eqp/tree/master/

Questo set di regole e quello in esecuzione sul processo di invio di Marketplace NON sono sempre perfettamente sincronizzati (anche se ovviamente è l'ideale), quindi potresti essere rifiutato per errori di codeniffer anche se passa l'ultima versione su Github.

Alcuni degli errori "severity-10" più comuni (gli unici errori per i quali l'estensione verrà rifiutata) e i loro consigli elencati includono:

Un tag di chiusura non è consentito alla fine di un file PHP

Raccomandazione: rimuovere il tag di chiusura PHP.

Le chiamate pass-by-reference per il tempo di chiamata sono vietate

Raccomandazione: leggere la documentazione sui riferimenti in PHP 5 e refactoring del codice. Riferimenti: http://php.net/manual/en/language.references.pass.php

Rilevato utilizzo diretto di $ _ENV Superglobal.

Rilevato utilizzo diretto di $ _GET Superglobal.

Rilevato utilizzo diretto di $ _POST Superglobal.

Rilevato utilizzo diretto di $ _REQUEST Superglobal.

Rilevato utilizzo diretto di $ _SESSION Superglobal.

Rilevato utilizzo diretto di $ GLOBALS Superglobal.

Raccomandazione: utilizzare gli oggetti wrapper corrispondenti per ottenere cookie, sessioni o dati di richiesta.

La funzione set_magic_quotes_runtime () è stata deprecata

Raccomandazione: le funzioni obsolete non devono essere utilizzate in quanto potrebbero essere rimosse in qualsiasi momento da una versione futura. [Probabilmente un errore generico per tutti gli ammortamenti]

Operatore identico === non viene utilizzato per testare il valore restituito della funzione strpos

Operatore identico === non viene utilizzato per testare il valore di ritorno della funzione stripos

Raccomandazione: utilizzare l'operatore === per verificare il valore di ritorno di questa funzione.

Utilizzo errato della costante della stringa di virgolette posteriori. Le virgolette posteriori devono essere sempre all'interno delle stringhe.

Raccomandazione: [nessuna raccomandazione separata. Immagino che questo sia quello di impedire l'esecuzione tramite backquotes.]

Manca il metodo ACL _isAllowed () nella classe [ClassName].

Raccomandazione: gestire con molta attenzione l'impostazione, la gestione e la gestione dei privilegi. La risorsa ACL deve essere definita nel file adminhtml.xml per ciascun controller adminhtml e deve essere implementato il metodo _isAllowed ().

Lo spazio dei nomi per la classe [ExceptionClassName] non è specificato.

Raccomandazione: specificare lo spazio dei nomi delle eccezioni.

Errore di sintassi PHP: il pass-by-reference del tempo di chiamata è stato rimosso

Raccomandazione: correggere l'errore di sintassi. [Questo accompagna quanto sopra. Immagino che un errore generico simile sia dato per tutti gli altri errori di sintassi PHP]

Possibile violazione del design di Magento 2. Rilevata tipica costruzione Magento 1.

Raccomandazione: [Questo non viene fornito con alcuna raccomandazione, ma descrive il codice in cui viene rilevato l'uso di classi come Mage :: blah o Mage_blah_blah :: blah - queste sono classi che esistono solo in Magento 1 e non funzioneranno in Magento 2. Una buona idea è quella di cerca la tua estensione M2 per il regex Mage(\b|_)per pre-verificare gli usi M1.]

risorsa è una parola riservata in PHP 7.

Raccomandazione: [nessuna raccomandazione separata. Il semplice rinominare la parola in qualcos'altro dovrebbe funzionare. Immagino che questo errore esista per tutte le parole riservate.]

Il tag di apertura PHP deve essere il primo contenuto nel file

Raccomandazione: rimuovere tutti i caratteri prima del tag di apertura PHP.

L'uso del costrutto del linguaggio die è scoraggiato.

L'uso del costrutto per il linguaggio di uscita è scoraggiato.

Raccomandazione: utilizzare il metodo dell'oggetto risposta setBody ().

L'uso del costrutto per il linguaggio dell'eco è scoraggiato.

L'uso del costrutto del linguaggio di stampa è scoraggiato.

Raccomandazione: l'architettura dell'estensione deve essere modificata per evitare l'uso di eco, intestazione ecc. Nelle classi, prendere in considerazione l'utilizzo del metodo setBody () dell'oggetto risposta.

L'uso di eval () è scoraggiato

Raccomandazione: evitare di usare eval ().


A differenza di questi errori, che causano il rifiuto dell'estensione, gli avvisi sono attualmente elencati solo come cortesia, per aiutare a migliorare il codice dell'estensione. NON verrai rifiutato dalla revisione tecnica per gli avvisi, per quanto ce ne siano molti.

Naturalmente, questa regola potrebbe essere inasprita in futuro e il set di regole di codesniffer è in costante revisione, quindi vedere quanti avvisi è possibile risolvere è sempre un buon piano. Gli avvisi possono anche indicare problemi sistemici con la tua base di codice.


Alcuni motivi per il rifiuto della revisione tecnica non vengono attualmente visualizzati nel rapporto online e sono indicati solo nell'e-mail.

Cose come violazioni di copia-incolla e malware rilevati avranno solo messaggi mostrati nell'e-mail che ti informano che l'estensione non è stata accettata, quindi leggi attentamente l'e-mail .

Un archivio di queste e-mail non è attualmente visibile dal portale per gli sviluppatori, quindi se le elimini senza leggere o le file nella posta indesiderata, allora non ci sono più.

I revisori di livello 1 di Magento a volte inseriscono informazioni aggiuntive in questa e-mail, sia solo cose utili che pensavano che potresti voler conoscere, come "questa chiave dell'array" sever "dovrebbe probabilmente essere" server ", o le ragioni per il loro rifiuto e suggerimenti su come risolverlo rapidamente, ad esempio "Hai copiato un intero file core Magento e hai appena cambiato il percorso di classe: puoi invece sostituirlo con un'impostazione delle preferenze di classe", oppure "Hai copiato un intero file core di Magento solo per cambiare un paio di funzioni pubbliche: puoi usare plugin per questo. "

Se non li leggi e dai un'occhiata al rapporto di codesniffer, potresti finire per provare a risolvere i problemi sbagliati.


Si noti che il unescaped output detectedmessaggio NON deve essere evitato usando i commenti @escapeNotVerifiedo @noEscape. Ciò sarà probabilmente vietato nelle versioni future di Magento. Utilizzare invece uno dei seguenti:

  • Qualsiasi stringa statica tra virgolette singole.
  • Una stringa statica tra virgolette doppie, senza variabili inline.
  • [consigliato] Un valore cavata con uno dei metodi di fuga da \Magento\Framework\View\Element\AbstractBlock( escapeHtml(), escapeUrl(), escapeQuote(), escapeXssInUrl()).
  • Un valore cast in un tipo numerico (almeno bool e int, forse altri?)
  • Qualsiasi metodo chiama con la parola "html" nel nome, come printBannerHtml(). Non abusare di questo! Assicurati che il tuo blahHtml()metodo esca davvero correttamente da tutte le variabili.

la mia estensione mostra un avviso ma nessuna delle precedenti è possibile quindi la mia estensione viene rifiutata a causa di un avviso?
Sanjay Gohil,

Ho pubblicato questo tempo fa - potrebbero essercene aggiunti di nuovi da allora. Quando accedi al tuo account sviluppatore, fai clic sull'estensione e visualizza il registro degli errori, qual è il messaggio che vedi e a che livello sono gli errori? Se non sono di gravità 10, potresti essere rifiutato per qualche altro motivo. Cosa dice l'e-mail di rifiuto?
Dewi Morgan,

6

Errore:

Rilevato output senza escape

Errore nel file .phtml

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

Tu gridi usa:

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

Fare riferimento alla sicurezza XSS dei modelli per http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templates


Questo è uno stile di programmazione straordinariamente scarso. Ti preghiamo di non abusare dei comandi @noEscapee @escapeNotValidatedin questo modo: se lo fai, è probabile che siano deprecati e quindi non consentiti dal sistema MEQP. Vedi il fondo della mia risposta per una vasta gamma di modi migliori per sfuggire ai tuoi dati.
Dewi Morgan,

1
@Dewi Morgan: grazie per le tue preziose informazioni.
Sankar_k,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.