Соответствие ЭКГ: как это сделать?

10

В Magento 1 есть что-то похожее coding standardна то , что нужно избегать множества вещей или методов, которые нельзя использовать.ECG

Давайте попробуем создать список, который охватывает все случаи, которые выдают «ошибки» или «предупреждения» в вашем коде.

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

Примечание: пожалуйста, постарайтесь избежать дублирования ответов;)

Загрузить: https://github.com/magento-ecg/coding-standard


ЭКГ нюхает

Классы

mysql4

Mysql4 классы устарели.

Объектная реализация

Непосредственное создание объекта (класс% s) не рекомендуется в Magento.

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

...

PHP

Перейти к

Использование goto не рекомендуется.

...

Пространство имен

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

...

Частный член класса

Частный член класса обнаружен.

...

Var

Частный член класса обнаружен.

...

Представление

Коллекция Count

Ненужная загрузка сбора данных 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

Raw Query

Обнаружен необработанный оператор 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',
);

...

Строка Конкат

Использование оператора + для объединения двух обнаруженных строк

...

Позиция строки

Идентичный оператор === не используется для проверки возвращаемого значения функции% s

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

Связанные вопросы и ответы для

sv3n
источник
LOL об этом посте, вы написали почти документ :)
PЯINCƏ
@ Принц кто-то может немного помочь, чтобы завершить это: P
sv3n
Я так не думаю :)
PЯINCƏ
любая альтернатива для stripcslashes ()? @ sv3n спасибо за такое описание вопросов и ответов :)
Keyur Shah
@KeyurShah Нет. Или игнорируйте предупреждение или старайтесь избегать «до» :) В каком случае вы его используете? Может быть, добавить это как вопрос?
18:30

Ответы:

6

Запрещенная функция

Файл существует()

Использование функции 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)) {
    ...
}
оборота св3н
источник
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)

Expamples:

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

Без ограничения до:

  • Всего вкл. Время стены (мксек): 2 116 522 мксек
  • Всего вкл. ЦП (микросекунд): 2101688 микросекунд
  • Всего вкл. 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 (байты): 1,856,064 байта
  • Количество функциональных вызовов: 5,515

Замечания:

Это предупреждение по-прежнему будет появляться, даже если вы ранее ограничивали свою коллекцию. Чтобы избавиться от этого сообщения, используйте $collection->getLastItem()вместо этого.

оборота св3н
источник
Я получаю Data access method LIMIT detected outside of Resource Modelпри использовании лимита`
Амит Патель
1
Вот больше деталей
Амит Патель
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();
sv3n
источник
Я использовал приведенный выше код, и он дает мне ошибку Uncaught Error: Class 'Custom\Rma\Helper\Varien_Http_Adapter_Curl' not found. Как использовать класс, я нашел его у продавца, но не повезло.
Нитин Павар
@NitinPawar, не могли бы вы открыть новый вопрос? Кажется, что-то не так с вашим кодом.
sv3n