Conformità ECG: come fare?


10

C'è qualcosa di simile a un coding standardper Magento 1 , chiamato ECGin cui molte cose dovrebbero essere evitate o metodi che non devono essere utilizzati.

Proviamo a creare un elenco che copra tutti i casi che generano "errori" o "avvisi" nel codice.

Di seguito troverai un elenco con tutti i possibili avvisi. Aggiornerò questo post a intervalli regolari e collegherò a risposte fornite e votate.

Nota: si prega di cercare di evitare risposte duplicate;)

Scarica: https://github.com/magento-ecg/coding-standard


Sniffer ECG

Classi

MySQL4

Le classi Mysql4 sono obsolete.

Istantanea di oggetti

L'istanza di oggetti diretti (classe% s) è sconsigliata in Magento.

protected $disallowedClassPrefixes = array(
    'Mage_',
    'Enterprise_',
);

...

PHP

Vai a

L'uso di goto è scoraggiato.

...

Spazio dei nomi

Lo spazio dei nomi per la classe "'. $ ExceptionClassName.'" Non è specificato.

...

Membro della classe privata

Rilevato membro della classe privata.

...

Var

Rilevato membro della classe privata.

...

Prestazione

Conteggio raccolta

Caricamento non necessario di una raccolta di dati Magento. Utilizzare invece il metodo getSize ().

fetchAll

fetchAll () può essere memoria inefficiente per grandi set di dati.

...

GetFirstItem

getFirstItem () non limita il risultato del caricamento della raccolta a un elemento.

Ciclo continuo

Funzione di calcolo della dimensione dell'array% s rilevata in loop

Metodo LSD modello% s rilevato in loop

Metodo di caricamento dati% s rilevato in loop

protected $countFunctions = array(
    'sizeof',
    'count'
);
protected $modelLsdMethods = array(
    'load',
    'save',
    'delete'
);

Sicurezza

acl

Manca il metodo ACL% s () nella classe% s.

const PARENT_CLASS_NAME = 'Mage_Adminhtml_Controller_Action';
const REQUIRED_ACL_METHOD_NAME = '_isAllowed';

...

Funzione scoraggiata

public $forbiddenFunctions = array(
    '^is_dir' => null,
    '^is_file$' => null,
    '^pathinfo$' => null,
);

...

Funzione proibita

public $forbiddenFunctions = array(
    '^assert$' => null,
    '^bind_textdomain_codeset$' => null,
    '^bindtextdomain$' => null,
    '^bz.*$' => null,
    '^call_user_func$' => null,
    '^call_user_func_array$' => null,
    '^chdir$' => null,
    '^chgrp$' => null,
    '^chmod$' => null,
    '^chown$' => null,
    '^chroot$' => null,
    '^com_load_typelib$' => null,
    '^copy$' => null,
    '^create_function$' => null,
    '^curl_.*$' => null,
    '^cyrus_connect$' => null,
    '^dba_.*$' => null,
    '^dbase_.*$' => null,
    '^dbx_.*$' => null,
    '^dcgettext$' => null,
    '^dcngettext$' => null,
    '^dgettext$' => null,
    '^dio_.*$' => null,
    '^dirname$' => null,
    '^dngettext$' => null,
    '^domxml_.*$' => null,
    '^exec$' => null,
    '^fbsql_.*$' => null,
    '^fdf_add_doc_javascript$' => null,
    '^fdf_open$' => null,
    '^fopen$' => null,
    '^fsockopen$' => null,
    '^ftp_.*$' => null,
    '^fwrite$' => null,
    '^gettext$' => null,
    '^gz.*$' => null,
    '^header$' => null,
    '^highlight_file$' => null,
    '^ibase_.*$' => null,
    '^id3_set_tag$' => null,
    '^ifx_.*$' => null,
    '^image.*$' => null,
    '^imap_.*$' => null,
    '^ingres_.*$' => null,
    '^ircg_.*$' => null,
    '^ldap_.*$' => null,
    '^link$' => null,
    '^mail$' => null,
    '^mb_send_mail$' => null,
    '^mkdir$' => null,
    '^move_uploaded_file$' => null,
    '^msession_.*$' => null,
    '^msg_send$' => null,
    '^msql$' => null,
    '^msql_.*$' => null,
    '^mssql_.*$' => null,
    '^mysql_.*$' => null,
    '^odbc_.*$' => null,
    '^opendir$' => null,
    '^openlog$' => null,
    '^ora_.*$' => null,
    '^ovrimos_.*$' => null,
    '^parse_ini_file$' => null,
    '^parse_str$' => null,
    '^parse_url$' => null,
    '^parsekit_compile_string$' => null,
    '^passthru$' => null,
    '^pcntl_.*$' => null,
    '^posix_.*$' => null,
    '^pfpro_.*$' => null,
    '^pfsockopen$' => null,
    '^pg_.*$' => null,
    '^php_check_syntax$' => null,
    '^popen$' => null,
    '^print_r$' => null,
    '^printf$' => null,
    '^proc_open$' => null,
    '^putenv$' => null,
    '^readfile$' => null,
    '^readgzfile$' => null,
    '^readline$' => null,
    '^readlink$' => null,
    '^register_shutdown_function$' => null,
    '^register_tick_function$' => null,
    '^rename$' => null,
    '^rmdir$' => null,
    '^scandir$' => null,
    '^session_.*$' => null,
    '^set_include_path$' => null,
    '^set_ini$' => null,
    '^set_time_limit$' => null,
    '^setcookie$' => null,
    '^setlocale$' => null,
    '^setrawcookie$' => null,
    '^shell_exec$' => null,
    '^sleep$' => null,
    '^socket_.*$' => null,
    '^stream_.*$' => null,
    '^sybase_.*$' => null,
    '^symlink$' => null,
    '^syslog$' => null,
    '^system$' => null,
    '^touch$' => null,
    '^trigger_error$' => null,
    '^unlink$' => null,
    '^vprintf$' => null,
    '^mysqli.*$' => null,
    '^oci_connect$' => null,
    '^oci_pconnect$' => null,
    '^quotemeta$' => null,
    '^sqlite_popen$' => null,
    '^time_nanosleep$' => null,
    '^base64_decode$' => null,
    '^base_convert$' => null,
    '^basename$' => null,
    '^chr$' => null,
    '^convert_cyr_string$' => null,
    '^dba_nextkey$' => null,
    '^dns_get_record$' => null,
    '^extract$' => null,
    '^fdf_.*$' => null,
    '^fget.*$' => null,
    '^fread$' => null,
    '^fflush$' => null,
    '^get_browser$' => null,
    '^get_headers$' => null,
    '^get_meta_tags$' => null,
    '^getallheaders$' => null,
    '^getenv$' => null,
    '^getopt$' => null,
    '^headers_list$' => null,
    '^hebrev$' => null,
    '^hebrevc$' => null,
    '^highlight_string$' => null,
    '^html_entity_decode$' => null,
    '^ibase_blob_import$' => null,
    '^id3_get_tag$' => null,
    '^import_request_variables$' => null,
    '^ircg_nickname_unescape$' => null,
    '^ldap_get_values$' => null,
    '^mb_decode_mimeheader$' => null,
    '^mb_parse_str$' => null,
    '^mcrypt_decrypt$' => null,
    '^mdecrypt_generic$' => null,
    '^msg_receive$' => null,
    '^ngettext$' => null,
    '^ob_get_contents$' => null,
    '^ob_get_flush$' => null,
    '^rawurldecode$' => null,
    '^shm_get_var$' => null,
    '^stripcslashes$' => null,
    '^stripslashes$' => null,
    '^token_get_all$' => null,
    '^unpack$' => null,
    '^convert_uudecode$' => null,
    '^iconv_mime_decode$' => null,
    '^iconv_mime_decode_headers$' => null,
    '^iconv_mime_encode$' => null,
    '^iconv_set_encoding$' => null,
    '^php_strip_whitespace$' => null,
    '^addcslashes$' => null,
    '^addslashes$' => null,
    '^escapeshellarg$' => null,
    '^escapeshellcmd$' => null,
    '^gettype$' => null,
    '^var_dump$' => null,
    '^tempnam$' => null,
    '^realpath$' => null,
    '^linkinfo$' => null,
    '^lstat$' => null,
    '^stat$' => null,
    '^lchgrp$' => null,
    '^lchown$' => null,
    '^show_source$' => null,
    '^is_executable$' => null,
    '^is_link$' => null,
    '^is_readable$' => null,
    '^is_writable$' => null,
    '^is_writeable$' => null,
    '^is_uploaded_file$' => null,
    '^glob$' => null,
    '^ssh2_.*$' => null,
    '^delete$' => null,
    '^file.*$' => null,
);

Includi file

Rilevata istruzione "% s". Le manipolazioni dei file sono scoraggiate.

... L'istruzione non è una funzione, non sono richieste parentesi.

... È vietato il passaggio di URL.

... è vietato concatenare.

... Le variabili all'interno non sono sicure.

public $urlPattern = '#(https?|ftp)://.*#i';

...

Costrutto linguistico

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

L'uso del costrutto del linguaggio% s è scoraggiato.

    return array(
        T_EXIT,
        T_ECHO,
        T_PRINT,
        T_BACKTICK
    );

...

superglobale

Rilevato utilizzo diretto di% s Superglobal.

public $superGlobalErrors = array(
    '$GLOBALS',
    '$_GET',
    '$_POST',
    '$_SESSION',
    '$_REQUEST',
    '$_ENV'
);
public $superGlobalWarning = array(
    '$_FILES',
    '$_COOKIE',
    '$_SERVER',
);

Sql

Query non elaborata

Rilevato possibile istruzione SQL non elaborata% s

public $statements = array(
    'SELECT',
    'UPDATE',
    'INSERT',
    'CREATE',
    'DELETE',
    'ALTER',
    'DROP'
);
public $queryFunctions = array(
    'query',
    'raw_query'
);

...

Query lenta

Rilevato possibile istruzione SQL lenta% s

Rilevato possibile metodo SQL lento% s

public $adapterMethods = array(
    'group',
    'having',
    'distinct',
    'addLikeEscape',
    'escapeLikeValue',
    'union',
    'orHaving',
);
public $rawStatements = array(
    'GROUP BY',
    'HAVING',
    'DISTINCT',
    'LIKE',
    'UNION',
);

...

stringhe

RegEx

Possibile espressione regolare eseguibile in% s. Assicurati che il pattern non contenga il modificatore "e"

public $functions = array(
    'preg_replace',
);

...

String Concat

Uso dell'operatore + per concatenare due stringhe rilevate

...

Posizione della stringa

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

public $functions = array(
    'strpos',
    'stripos',
);

Domande e risposte correlate per le


LOL su questo post, hai scritto quasi un documento :)
PЯINCƏ

@Prince qualcun altro potrebbe aiutare un po 'a completare questo: P
sv3n

Io non la penso così :)
PЯINCƏ

qualche alternativa per stripcslashes ()? @ sv3n grazie per tale descrizione domanda e risposte :)
Keyur Shah

@KeyurShah No. O ignora l'avvertimento o cerca di evitare "prima" :) In quale caso lo usi? Forse aggiungi questo come domanda?
sv3n

Risposte:


6

Funzione proibita

il file esiste()

L'uso della funzione file_exists () è vietato

non corretta:

if (!file_exists($filePath)) {
    ...
}

corretta:

$io = new Varien_Io_File();
if (!$io->fileExists($filePath)) {
    ...
}

o

$validatorNot = new Zend_Validate_File_NotExists($path);
if ($validatorNot->isValid($file)) {
    ...
}

5

GetFirstItem

getFirstItem () non limita il risultato del caricamento della raccolta a un elemento.

non corretta:

$collection = Mage::getModel('catalog/category')
    ->load(41)
    ->getProductCollection()
    ->addAttributeToSelect('weight');

$product = $collection->getFirstItem();
$weight  = $product->getData('weight');

corretta:

Applicare il limite prima di acquisire i dati.

$collection->getSelect()->limit(1)

o

$collection->setPageSize(1, 1)

Expamples:

Collezione con 750 prodotti ...

Senza limitare prima:

  • Totale incl. Wall Time (microsec): 2.116.522 microsec
  • Totale incl. CPU (microsec): 2.101.688 microsec
  • Totale incl. MemUse (byte): 4.783.504 byte
  • Totale incl. PeakMemUse (byte): 4.363.112 byte
  • Numero di chiamate di funzione: 104.187

Con l'utilizzo di getSelect()->limit(1):

  • Totale incl. Wall Time (microsec): 149.803 microsec
  • Totale incl. CPU (microsec): 131.405 microsec
  • Totale incl. MemUse (byte): 2.384.840 byte
  • Totale incl. PeakMemUse (byte): 1.827.112 byte
  • Numero di chiamate di funzione: 5.327

Con l'utilizzo setPageSize(1, 1)

  • Totale incl. Wall Time (microsec): 155.025 microsecs
  • Totale incl. CPU (microsec): 136.191 microsec
  • Totale incl. MemUse (byte): 2.413.128 byte
  • Totale incl. PeakMemUse (byte): 1.856.064 byte
  • Numero di chiamate di funzione: 5.515

Nota:

Questo avviso verrà comunque visualizzato, anche se in precedenza hai limitato la raccolta. Per eliminare questo messaggio, utilizzare $collection->getLastItem()invece.


Ricevo Data access method LIMIT detected outside of Resource Modelquando uso il limite`
Amit Patel,

1
Ecco maggiori dettagli
Amit Patel,

5

Funzione proibita

curl_xyz

L'uso della funzione curl_init (), curl_setopt (), curl_exec (), curl_close () è vietato

non corretta:

$ch = curl_init();
curl_setopt($connection, CURLOPT_HTTPHEADER, $header);
curl_setopt($connection, CURLOPT_POSTFIELDS, $request);
curl_setopt($connection, CURLOPT_URL, $url);
$response = curl_exec($ch);
curl_close($ch);

corretta:

$options = array(
    CURLOPT_HTTPHEADER => $header,
    CURLOPT_POSTFIELDS => $request
);

$curl = new Varien_Http_Adapter_Curl();
$curl->setOptions($options);
$curl->write(Zend_Http_Client::GET, $url, Zend_Http_Client::HTTP_0);
$response = $curl->read();
$responseBody = Zend_Http_Response::extractBody($response);
$curl->close();

Ho usato il codice sopra e mi sta dando errore Uncaught Error: Class 'Custom\Rma\Helper\Varien_Http_Adapter_Curl' not found. Come usare la classe l'ho trovata nel venditore ma senza fortuna.
Nitin Pawar,

@NitinPawar puoi per favore aprire una nuova domanda? Qualcosa sembra essere sbagliato nel tuo codice.
sv3n
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.