Как исправить предупреждения / ошибки, вызванные отчетом о техническом обзоре Magento Marketplace?
-
29-09-2020 - |
Вопрос
С новым Magento Marketplace отправленное расширение проходит несколько состояний проверки, чтобы быть одобренным и доступным через Marketplace.
Одним из них является технический обзор, из которого вы можете получить технический отчет, подобный следующему:
Как вы можете видеть, более 200 предупреждений напугали меня до чертиков, есть ли какой-нибудь ресурс, который поможет исправить каждое предупреждение, кроме списка, доступного в документах: http://docs.magento.com/marketplace/user_guide/extensions/review-code-validation.html?
Решение
После часа изучения отчета я составил следующий список, который, как мне кажется, может быть полезен всем.
Я постараюсь обновлять его, как только найду больше предупреждений / ошибок:
Предупреждения
Строка превышает 80 символов;содержит X символов
Или
Строка превышает максимальный лимит в 100 символов;содержит X символов
Это те, которые я видел чаще всего, они говорят сами за себя, хорошей практикой является сохранение небольших строк кода, чтобы сохранить чистый и читаемый код.
Не найдено пробела после запятой при вызове функции
Вы вызвали функцию, которая получает параметры, и не добавили пробел после запятой.Пример: strrchr($bla,".")
должно быть strrchr($bla, ".")
Ожидаемый \"while (...) { \";найдено \"while (...) { \"
Ожидаемый \"foreach (...) { \";найдено \"foreach (...) { \"
Ожидаемый \"if (...) { \";найдено \"если (...) { \"
Ожидаемый \"} else { \";найдено \"} else { \"
Это означает, что вы вернули строку перед открывающей скобкой этих операторов PHP.
Пример неправильного синтаксиса с оператором if /else:
if (true)
{
}
else
{
}
Должно быть
if (true) {
} else {
}
Закрывающая скобка и открывающая скобка многострочного объявления функции должны находиться в одной строке
В большинстве случаев это происходит в конструкторе, где вы объявляете что-то вроде этого:
public function __construct(
ProductFactory $productFactory,
Test $test
)
{
}
В то время как это должно быть:
public function __construct(
ProductFactory $productFactory,
Test $test
) {
}
Недопустимый символ в конце строки;ожидаемый \" \", но найденный \" \"
Происходит в большинстве случаев в начале файла, это вызвано тем, как ваша IDE кодирует возвращаемый символ.
Переменная "your_variable" не имеет допустимого формата camel caps
Каждая переменная должна использовать формат camel caps, так что $your_variable
должно быть $yourVariable
Переменная "one2Three" содержит числа, но это не рекомендуется
Избегайте использования чисел в ваших переменных
Встроенные структуры управления не допускаются
Вы не должны использовать встроенные структуры управления, такие как:
else $test = true;
Вы должны использовать:
else {
$test = true;
}
Открывающая фигурная скобка класса должна находиться в строке после определения
Вы вернули строку при объявлении класса:
class Test
{
Вы должны оставить открывающую фигурную скобку на той же строке:
class Test {
Закрытая переменная-член \"yourVariable\" должна содержать начальный символ подчеркивания
Защищенная переменная-член \"yourVariable\" должна содержать начальный символ подчеркивания
Вам следует добавить начальный знак подчеркивания к вашим защищенным и закрытым переменным-членам: $_yourVariable
В противоположность этим двум, если вы добавите символ подчеркивания в свою общедоступную переменную, вы можете получить:
Общедоступная переменная-член \"_yourVariable\" не должна содержать начальный символ подчеркивания.
Параметр метода $bla никогда не используется
Вы передали параметр методу, но никогда им не пользуетесь.
Многострочное объявление функции с неправильным отступом;ожидалось 8 пробелов, но найдено X
Вы добавили слишком много отступов к параметрам объявления вашей функции:
public function __construct(ProductRepository $productRepository,
ListsInterface $listsInterface,
Data $helper
) {
Должно быть:
public function __construct(ProductRepository $productRepository,
ListsInterface $listsInterface,
Data $helper
) {
Обнаружено возможное переопределение бесполезного метода
Вы переопределяете метод без добавления изменений, например:
public function __construct(Context $context) {
parent::__construct($context);
}
Загрузка метода Model LSD() обнаружена в цикле
Вы используете load()
метод внутри цикла, который не рекомендуется и которого следует избегать.
Скорее всего, ваш код выглядит примерно так:
foreach(...) {
$model->load();
}
Если вы загружаете модель в цикле, это действительно довольно плохо с точки зрения производительности.Если вам нужно получить только несколько атрибутов, вам следует использовать collections вместо этого.
Цикломатическая сложность функции (X) превышает 10;рассмотрите возможность рефакторинга функции
Если вы не знакомы с цикломатической сложностью, я предлагаю вам ознакомиться с этим постом: https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html .Это предупреждение в основном означает, что в вашей функции слишком много циклов и условий.
Прямое создание объекта не рекомендуется в Magento 2
Это вызвано тем фактом, что вы создаете экземпляр объекта напрямую, вызывая класс, например:
new \Zend_Filter_LocalizedToNormalized
Вам следует использовать внедрение зависимостей или, в крайнем случае, диспетчер объектов.
Комментарии относятся к текущей задаче
Один из ваших комментариев содержит следующее @TODO
Отметить.
Избегайте утверждений IF, которые всегда являются истинными или ложными
Вы создали условие, которое, кажется, всегда является истинным или ложным.
Например:
$variable = "6";
...
// More code that doesn't change $variable
...
if ($variable)
Ошибки
Пространство имен для класса \"Class\" не указано.
Вы упускаете из виду use Path\To\Class;
заявление в начале вашего занятия.
Другие советы
Использование Codesniffer с набором правил MEQP1 или MEQP2 (в зависимости от вашей версии Magento) даст вам представление о наборе правил Magento: https://github.com/magento/marketplace-eqp/tree/master/
Этот набор правил и тот, который выполняется в процессе отправки Marketplace, не всегда идеально синхронизированы (хотя, конечно, это идеальный вариант), поэтому вы можете получить отказ из-за ошибок codesniffer, даже если он соответствует последней версии на Github.
Некоторые из наиболее распространенных ошибок "серьезности 10" (единственные ошибки, из-за которых ваше расширение будет отклонено) и их рекомендации включают:
Закрывающий тег не допускается в конце PHP-файла
Рекомендация:Удалите закрывающий тег PHP.
Вызовы с пропуском времени вызова по ссылке запрещены
Рекомендация:Прочтите документацию по ссылкам в PHP 5 и выполните рефакторинг своего кода.Ссылки: http://php.net/manual/en/language.references.pass.php
Обнаружено прямое использование суперглобала $_ENV.
Обнаружено прямое использование суперглобального $_GET.
Обнаружено прямое использование суперглобала $_POST.
Обнаружено прямое использование суперглобального $_REQUEST.
Обнаружено прямое использование суперглобала $_SESSION.
Обнаружено прямое использование $GLOBALS Superglobal.
Рекомендация:Используйте соответствующие объекты-оболочки для получения данных cookie, сеанса или запроса.
Функция set_magic_quotes_runtime() устарела
Рекомендация:Не следует использовать устаревшие функции, поскольку они могут быть удалены в любое время из будущей версии.[Вероятно, общая ошибка для всех устаревших версий]
Идентичный оператор === не используется для проверки возвращаемого значения функции strpos
Идентичный оператор === не используется для проверки возвращаемого значения функции stripos
Рекомендация:Используйте оператор === для проверки возвращаемого значения этой функции.
Неправильное использование строковой константы в обратных кавычках.Обратные кавычки всегда должны быть внутри строк.
Рекомендация:[отдельной рекомендации нет.Я предполагаю, что это делается для того, чтобы предотвратить exec с помощью обратных кавычек.]
Отсутствует метод _isAllowed() ACL в классе [className].
Рекомендация:Очень тщательно управляйте настройкой, управлением и обработкой привилегий.Ресурс ACL должен быть определен в adminhtml.xml файле для каждого контроллера adminhtml и должен быть реализован метод _isAllowed().
Пространство имен для класса [ExceptionClassName] не указано.
Рекомендация:Укажите пространство имен исключений.
Синтаксическая ошибка PHP:Ссылка на передачу времени вызова была удалена
Рекомендация:Исправлена синтаксическая ошибка.[Это сопровождает вышесказанное.Я предполагаю, что аналогичная общая ошибка выдается для всех других синтаксических ошибок PHP]
Возможное нарушение дизайна Magento 2.Обнаружена типичная конструкция Magento 1.
Рекомендация:[Это не содержит рекомендаций, но описывает код, в котором обнаружено использование классов, таких как Mage::blah или Mage_blah_blah ::blah - это классы, которые существуют только в Magento 1 и не будут работать в Magento 2.Хорошая идея - выполнить поиск регулярного выражения в вашем расширении M2 Mage(\b|_)
предварительно проверить, используется ли M1.]
resource - это зарезервированное слово в PHP 7.
Рекомендация:[Отдельной рекомендации нет.Простое переименование слова во что-то другое должно сработать.Я предполагаю, что эта ошибка существует для всех зарезервированных слов.]
Открывающий PHP-тег должен быть первым содержимым в файле
Рекомендация:Удалите все символы перед открытием тега PHP.
Использование языковой конструкции не рекомендуется.
Использование языковой конструкции exit не рекомендуется.
Рекомендация:Следует использовать метод объекта ответа setBody().
Использование языковой конструкции echo не рекомендуется.
Использование конструкции печатного языка не рекомендуется.
Рекомендация:Архитектура расширения должна быть изменена, чтобы избежать использования echo, заголовка и т.д.в классах рассмотрите возможность использования метода setBody() объекта response.
Использование eval() не рекомендуется
Рекомендация:Избегайте использования eval().
В отличие от этих ошибок, из-за которых ваше расширение отклоняется, предупреждения в настоящее время перечислены просто из вежливости, чтобы помочь улучшить код вашего расширения.Вам НЕ будет отказано в технической проверке из-за предупреждений, сколько бы их ни было.
Конечно, в будущем это правило может быть ужесточено, и набор правил codesniffer постоянно пересматривается, поэтому всегда полезно посмотреть, сколько предупреждений вы можете устранить.Предупреждения также могут указывать на системные проблемы с вашей кодовой базой.
Некоторые причины отказа от технической проверки в настоящее время не указаны в онлайн-отчете и указаны только в электронном письме.
При обнаружении таких нарушений, как копирование-вставка и вредоносное ПО, в полученном вами электронном письме будут отображаться только сообщения о том, что ваше расширение не было принято, поэтому внимательно прочтите электронное письмо.
Архив этих писем в настоящее время не виден на портале разработчиков, поэтому, если вы удалите их, не читая, или отправите в корзину, они исчезнут.
Рецензенты Magento уровня 1 иногда помещают в это электронное письмо дополнительную информацию, либо просто полезные вещи, о которых, по их мнению, вы могли бы захотеть узнать, например "этот ключ массива 'sever', вероятно, должен быть 'server'", либо причины их отклонения и предложения о том, как быстро решить эту проблему, например "Вы скопировали весь файл ядра Magento и просто изменили путь к классу:вместо этого вы можете заменить это параметром предпочтения класса.", или "Вы скопировали весь файл ядра Magento просто для того, чтобы изменить пару общедоступных функций:вместо этого вы можете использовать плагины для этого ".
Если вы не прочтете это, а просто посмотрите на отчет codesniffer, вы можете в конечном итоге попытаться устранить неправильные проблемы.
Обратите внимание , что unescaped output detected
сообщение НЕ должно быть пропущено с помощью @escapeNotVerified
или @noEscape
Комментарии.Скорее всего, это будет запрещено в будущих версиях Magento.Вместо этого используйте один из следующих способов:
- Любая статическая строка в одинарных кавычках.
- Статическая строка в двойных кавычках, без встроенных переменных.
- [рекомендуется] Значение, экранированное с помощью одного из методов экранирования из
\Magento\Framework\View\Element\AbstractBlock
(escapeHtml()
,escapeUrl()
,escapeQuote()
,escapeXssInUrl()
). - Значение, приведенное к числовому типу (по крайней мере, bool и int, может быть, другие?)
- Любой вызов метода со словом "html" в имени, например
printBannerHtml()
.Не злоупотребляйте этим!Убедитесь, что вашblahHtml()
метод действительно корректно экранирует все переменные.
Ошибка:
Обнаружена беззаботный выход
Ошибка в файле .phtml
<ul class="form-list" id="payment_form_<?php echo $code ?>" style="display:none;">
.
Вы кричите:
<ul class="form-list" id="payment_form_<?php /* @noEscape */ echo $code ?>" style="display:none;">
.
См. Шаблоны XSS Security для http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-seecurity.html#escape-functions-form-templates / P >.