Cumplimiento de ECG: ¿cómo hacerlo?

10

Hay algo así como una coding standardde Magento 1 , llamado ECGen numerosas cosas deben evitarse o métodos que no deben ser utilizados.

Intentemos crear una lista que cubra todos los casos que arrojan "errores" o "advertencias" en su código.

A continuación encontrará una lista con todas las advertencias posibles. Actualizaré esta publicación a intervalos regulares y vincularé a las respuestas dadas y votadas.

Nota: intente evitar respuestas duplicadas;)

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


Oler ECG

Clases

Mysql4

Las clases de Mysql4 son obsoletas.

Objeto de instanciación

La instanciación directa de objetos (clase% s) no se recomienda en Magento.

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

...

PHP

Ir

Se desaconseja el uso de goto.

...

Espacio de nombres

El espacio de nombres para la clase "'. $ ExceptionClassName.'" No está especificado.

...

Miembro de clase privada

Miembro de la clase privada detectado.

...

Var

Miembro de la clase privada detectado.

...

Actuación

Recuento de colecciones

Carga innecesaria de una recopilación de datos de Magento. Utilice el método getSize () en su lugar.

FetchAll

fetchAll () puede ser ineficiente en la memoria para grandes conjuntos de datos.

...

GetFirstItem

getFirstItem () no limita el resultado de la carga de recopilación a un elemento.

Lazo

Función de cálculo de tamaño de matriz% s detectada en bucle

Modelo de método LSD% s detectado en bucle

Método de carga de datos% s detectado en bucle

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

Seguridad

Acl

Falta el método% s () ACL en la clase% s.

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

...

Función desanimada

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

...

Función prohibida

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,
);

Incluir archivo

Se detectó la instrucción "% s". Se desaconsejan las manipulaciones de archivos.

... La declaración no es una función, no se requieren paréntesis.

... Pasar urls está prohibido.

... Concatenar está prohibido.

... Las variables en el interior son inseguras.

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

...

Construcción del lenguaje

Uso incorrecto de la cadena de comillas posteriores constante. Las comillas traseras deben estar siempre dentro de las cadenas.

Se desaconseja el uso de la construcción del lenguaje% s.

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

...

Superglobal

Uso directo de% s Superglobal detectado.

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

SQL

Consulta sin procesar

Posible sentencia de SQL sin procesar% s detectada

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

...

Consulta lenta

Posible instrucción SQL lenta% s detectada

Posible método SQL lento% s detectado

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

...

Instrumentos de cuerda

RegEx

Posible expresión regular ejecutable en% s. Asegúrese de que el patrón no contenga el modificador "e"

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

...

Concat de cuerda

Uso del operador + para concatenar dos cadenas detectadas

...

Posición de cuerda

El operador idéntico === no se usa para probar el valor de retorno de la función% s

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

Preguntas y respuestas relacionadas con las

sv3n
fuente
LOL sobre esta publicación, escribiste casi un documento :)
PЯINCƏ
@Prince alguien más podría ayudar un poco para completar esto: P
sv3n
Yo no lo creo :)
PЯINCƏ
alguna alternativa para stripcslashes ()? @ sv3n gracias por tal descripción, pregunta y respuestas :)
Keyur Shah
@KeyurShah No. O ignore la advertencia o trate de evitar "antes" :) ¿En qué caso la usa? Tal vez agregar esto como pregunta?
sv3n

Respuestas:

6

Función prohibida

El archivo existe()

El uso de la función file_exists () está prohibido

incorrecto:

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

correcto:

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

o

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

GetFirstItem

getFirstItem () no limita el resultado de la carga de recopilación a un elemento.

incorrecto:

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

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

correcto:

Aplicar límite antes de tomar datos.

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

o

$collection->setPageSize(1, 1)

Muestras:

Colección con 750 productos ...

Sin limitar antes:

  • Total incl. Tiempo de pared (microsec): 2,116,522 microsecs
  • Total incl. CPU (microsecs): 2,101,688 microsecs
  • Total incl. MemUse (bytes): 4,783,504 bytes
  • Total incl. PeakMemUse (bytes): 4,363,112 bytes
  • Número de llamadas a funciones: 104,187

Con el uso de getSelect()->limit(1):

  • Total incl. Tiempo de pared (microsec): 149,803 microsecs
  • Total incl. CPU (microsecs): 131,405 microsecs
  • Total incl. MemUse (bytes): 2,384,840 bytes
  • Total incl. PeakMemUse (bytes): 1,827,112 bytes
  • Número de llamadas a funciones: 5,327

Con el uso setPageSize(1, 1)

  • Total incl. Tiempo de pared (microsec): 155,025 microsecs
  • Total incl. CPU (microsecs): 136,191 microsecs
  • Total incl. MemUse (bytes): 2,413,128 bytes
  • Total incl. PeakMemUse (bytes): 1,856,064 bytes
  • Número de llamadas a funciones: 5,515

Nota:

Esta advertencia seguirá apareciendo, incluso si limita su colección anteriormente. Para deshacerse de este mensaje, use $collection->getLastItem()en su lugar.

revs sv3n
fuente
Me estoy haciendo Data access method LIMIT detected outside of Resource Modelal utilizar Límite de las aguas
Amit Patel
1
Aquí hay más detalles
Amit Patel
5

Función prohibida

curl_xyz

El uso de la función curl_init (), curl_setopt (), curl_exec (), curl_close () está prohibido

incorrecto:

$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);

correcto:

$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();
sv3n
fuente
Usé el código anterior y me está dando un error Uncaught Error: Class 'Custom\Rma\Helper\Varien_Http_Adapter_Curl' not found. Cómo usar la clase, la encontré en el proveedor, pero no tuve suerte.
Nitin Pawar
@NitinPawar, ¿puedes abrir una nueva pregunta? Algo parece estar mal con su código.
sv3n