Как исправить предупреждения / ошибки, вызванные отчетом о техническом обзоре Magento Marketplace?

magento.stackexchange https://magento.stackexchange.com/questions/111085

Вопрос

С новым Magento Marketplace отправленное расширение проходит несколько состояний проверки, чтобы быть одобренным и доступным через Marketplace.

Одним из них является технический обзор, из которого вы можете получить технический отчет, подобный следующему:

Marketplace Technical Report

Как вы можете видеть, более 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 >.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top