Відповідність ЕКГ: як це зробити?


10

Існує що - щось на зразок coding standardдля Magento 1 , називається ECGде численні речі слід уникати або методів , які не повинні бути використані.

Спробуємо створити список, який охоплює всі випадки, які викидають у вашому коді "помилки" чи "попередження".

Нижче ви знайдете список із усіма можливими попередженнями. Я буду оновлювати цю публікацію через регулярні проміжки часу та посилатись на відповіді та відповіді.

Примітка. Будь ласка, намагайтеся уникати повторюваних відповідей;)

Завантажте: https://github.com/magento-ecg/coding-standard


ЕКГ Sniffs

Заняття

Mysql4

Класи Mysql4 є застарілими.

Огляд об'єкта

Пряме створення об'єкта (клас% s) відмовляється в Magento.

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

...

PHP

Йти до

Використання goto не рекомендує.

...

Простір імен

Простір імен для класу "'. $ IzuzetClassName.'" Не вказано.

...

Член приватного класу

Виявлено приватного учасника класу.

...

Вар

Виявлено приватного учасника класу.

...

Продуктивність

Колекція кол

Непотрібне завантаження збору даних Magento. Використовуйте замість цього метод getSize ().

FetchAll

fetchAll () може бути неефективною для пам'яті для великих наборів даних.

...

GetFirstItem

getFirstItem () не обмежує результат завантаження колекції одним елементом.

Петля

У циклі виявлено функцію обчислення розміру масиву% s

Модель методу LSD% s виявлена ​​в циклі

Метод завантаження даних% s виявлений у циклі

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

Безпека

Acl

Відсутній метод ACL% s () у класі% s.

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

...

Заборонена функція

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

...

Заборонена функція

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

Включити файл

Виявлено оператор "% s". Маніпуляції з файлами перешкоджають.

... Заява не є функцією, дужки не потрібні.

... Передавати URL-адреси заборонено.

... Об’єднання заборонено.

... Змінні всередині небезпечні.

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

...

Мовна конструкція

Неправильне використання постійної постійної рядка цитати. Зворотні лапки повинні бути завжди всередині рядків.

Використання мовної конструкції% s не рекомендується.

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

...

Суперглобальний

Виявлено безпосереднє використання% s Superglobal.

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

Sql

Сирий запит

Виявлено можливий необроблений оператор SQL% s

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

...

Повільний запит

Виявлено повільний оператор SQL% s

Виявлено повільний метод SQL% s

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

...

Струни

RegEx

Можливий виконуваний регулярний вираз у% s. Переконайтеся, що в шаблоні не міститься модифікатор "e"

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

...

Рядок Concat

Використання оператора + для об'єднання виявлених двох рядків

...

Позиція рядка

Ідентичний оператор === не використовується для тестування значення повернення функції% s

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

Питання та відповіді, пов'язані з


LOL про цю посаду, ви написали майже doc :)
PЯINCƏ

@Prince хтось інший міг би трохи допомогти виконати це: P
sv3n

Я не думаю так :)
PЯINCƏ

будь-яка альтернатива для стриптиз ()? @ sv3n дякую за таке опис питання та відповіді :)
Кейур Шах

@KeyurShah Ні. Ігноруйте попередження або намагайтеся уникати "до" :) У якому випадку ви його використовуєте? Може додати це як питання?
sv3n

Відповіді:


6

Заборонена функція

file_exists ()

Використання функції file_exists () заборонено

неправильно:

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

правильно:

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

або

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

5

GetFirstItem

getFirstItem () не обмежує результат завантаження колекції одним елементом.

неправильно:

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

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

правильно:

Застосувати ліміт перед захопленням даних.

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

або

$collection->setPageSize(1, 1)

Приклади:

Колекція з 750 продуктами ...

Не обмежуючись раніше:

  • Всього в т.ч. Час стіни (мікросек.): 2,116 522 мікросекунди
  • Всього в т.ч. CPU (мікросекунди): 2,101,688 мікросекунди
  • Всього в т.ч. MemUse (байти): 4,783,504 байт
  • Всього в т.ч. PeakMemUse (байти): 4,363,112 байт
  • Кількість викликів функцій: 104,187

За допомогою getSelect()->limit(1):

  • Всього в т.ч. Час стіни (мікросек.): 149 803 мікросекунди
  • Всього в т.ч. ЦП (мікросекунди): 131 405 мікросекунд
  • Всього в т.ч. MemUse (байти): 2,384,840 байт
  • Всього в т.ч. PeakMemUse (байти): 1,827,112 байт
  • Кількість функціональних дзвінків: 5,327

З використанням setPageSize(1, 1)

  • Всього в т.ч. Час стіни (мікросек.): 155,025 мікросек
  • Всього в т.ч. ЦП (мікросекунди): 136,191 мікросекунд
  • Всього в т.ч. MemUse (байти): 2,413,128 байт
  • Всього в т.ч. PeakMemUse (байти): 1856,064 байт
  • Кількість функціональних дзвінків: 5,515

Примітка:

Це попередження все ще з’явиться, навіть якщо ви обмежили свою колекцію раніше. Щоб позбутися цього повідомлення, використовуйте $collection->getLastItem()натомість.


Я отримую, Data access method LIMIT detected outside of Resource Modelколи використовую ліміт`
Amit Patel

1
Ось більш докладно
Amit Patel

5

Заборонена функція

curl_xyz

Використання функції curl_init (), curl_setopt (), curl_exec (), curl_close () заборонено

неправильно:

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

правильно:

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

Я використовував вище код, і він дає мені помилку Uncaught Error: Class 'Custom\Rma\Helper\Varien_Http_Adapter_Curl' not found. Як користуватися класом, я знайшов його у продавця, але не пощастило.
Нітін Павар

@NitinPawar ви можете, будь ласка, відкрити нове запитання? З вашим кодом щось здається не так.
sv3n
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.