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

25

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

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

Торговая площадка Технический отчет

Как вы можете видеть, 200+ предупреждений, черт возьми, напугало меня, есть ли какой-нибудь ресурс, который поможет исправить каждое предупреждение, кроме списка, доступного в документации: http://docs.magento.com/marketplace/user_guide/extensions/ review-code-validation.html ?

Рафаэль в цифровом пианизме
источник
Я чувствую, что кто-то должен предложить здесь использовать PHP CodeSniffer и какой бы стандарт не использовался в Magento 2 ... PSR-2? Конечно !?
Робби Аверилл
Он использует как PSR-1, так и PSR-2.
Маниш
@raphael, пожалуйста, посмотрите это, magento.stackexchange.com/questions/192506/…
abhishek
@raphael, пожалуйста, посмотрите это: magento.stackexchange.com/questions/71399/…
abhishek,

Ответы:

31

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

Я постараюсь держать его в курсе, как только найду больше предупреждений / ошибок:

Предупреждения

Строка превышает 80 символов; содержит X символов

Или

Строка превышает максимальный предел в 100 символов; содержит X символов

Это те, которые я видел больше всего, они говорят сами за себя, это хорошая практика - держать строки кода маленькими, чтобы сохранить чистый и читаемый код.

Пробел не найден после запятой в вызове функции

Вы вызвали функцию, которая получает параметры и не добавили пробел после запятой. Пример: strrchr($bla,".")должно бытьstrrchr($bla, ".")

Ожидаемый \ "while (...) {\ n \"; найдено \ "while (...) \ n {\ n \"

Ожидаемый \ "foreach (...) {\ n \"; найдено \ "foreach (...) \ n {\ n \"

Ожидаемый \ "if (...) {\ n \"; найдено \ "if (...) \ n {\ n \"

Ожидаемый \ "} else {\ n \"; найдено \ "} \ n else {\ n \"

Это означает, что вы вернули строку перед открывающей скобкой этих операторов PHP.

Пример неправильного синтаксиса с оператором if / else:

if (true)
{
}
else
{
}

Должно быть

if (true) {
} else {
}

Закрывающая скобка и открывающая скобка многострочного объявления функции должны быть в одной строке

В большинстве случаев это происходит в конструкторе, где вы объявляете что-то вроде этого:

public function __construct(
    ProductFactory $productFactory,
    Test $test
)
{
}

Принимая во внимание, что это должно быть:

public function __construct(
    ProductFactory $productFactory,
    Test $test
) {
}

Недопустимый символ конца строки; ожидаемый \ "\ n \", но найденный \ "\ r \ n \"

Происходит в большинстве случаев в начале файла, это связано с тем, как ваша IDE кодирует возвращаемый символ.

Переменная \ "your_variable \" не в правильном формате верблюжьих шапок

Каждая переменная должна использовать формат верблюд шапки, так $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);
}

Модель LSD метода load () обнаружена в цикле

Вы используете load()метод внутри цикла, который не рекомендуется и его следует избегать.

Скорее всего, ваш код выглядит так:

foreach(...) {
    $model->load();
}

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

Цикломатическая сложность функции (X) превышает 10; рассмотреть возможность рефакторинга функции

Если вы не знакомы с цикломатической сложностью, я предлагаю вам прочитать эту статью: https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html . Это предупреждение в основном означает, что в вашей функции слишком много циклов и условий.

В Magento 2 прямое создание объектов нежелательно.

Это вызвано тем, что вы создаете экземпляр объекта напрямую, вызывая класс, например:

new \Zend_Filter_LocalizedToNormalized

Вы должны использовать внедрение зависимостей или, в крайнем случае, менеджер объектов.

Комментарии относятся к задаче TODO

Один из ваших комментариев содержит следующий @TODOфлаг.

Избегайте IF утверждений, которые всегда верны или ложны

Вы создали условие, которое кажется всегда истинным или ложным.

Например:

$variable = "6";
...
// More code that doesn't change $variable
...
if ($variable)

ошибки

Пространство имен для класса \ "Class \" не указано.

Вы пропускаете use Path\To\Class;утверждение в начале вашего класса.

Рафаэль в цифровом пианизме
источник
1
Если я правильно понял это, эти рекомендации относятся ко всем расширениям M2 (даже для личного использования)?
Сергей Учухлебау
@SiarheyUchukhlebau: да, это технический отчет, который вы получите, загрузив расширение на Magento Marketplace
Рафаэль на Digital Pianism
1
You should keep the opening brace on the same line:разве это не наоборот? Кстати,
отличный
@ClaudiuCreanga Я думаю, что вы правы, позвольте мне перепроверить;)
Рафаэль в Digital Pianism
Можно ли протолкнуть расширение, которое имеет более 10k предупреждающих сообщений? Или они отвергают все, что имеет предупреждения?
Роланд Соос
9

Использование Codesniffer с набором правил MEQP1 или MEQP2 (в зависимости от вашей версии Magento) даст вам представление о наборе правил Magento: https://github.com/magento/marketplace-eqp/tree/master/

Этот набор правил и тот, который выполняется в процессе отправки Marketplace, не всегда идеально синхронизированы (хотя, конечно, это идеальный вариант), поэтому вы можете получить отклонение из-за ошибок codeniffer, даже если он передает последнюю версию на Github.

Некоторые из наиболее распространенных ошибок "серьезности-10" (единственные ошибки, для которых ваше расширение будет отклонено), и их перечисленные рекомендации включают:

Закрывающий тег не разрешен в конце файла PHP

Рекомендация: удалите закрывающий тег PHP.

Переадресация вызовов по ссылке запрещена

Рекомендация: прочтите документацию по ссылкам в PHP 5 и выполните рефакторинг вашего кода. Ссылки: http://php.net/manual/en/language.references.pass.php

Обнаружено прямое использование $ _ENV Superglobal.

Обнаружено прямое использование $ _GET Superglobal.

Обнаружено прямое использование $ _POST Superglobal.

Обнаружено прямое использование $ _REQUEST Superglobal.

Обнаружено прямое использование $ _SESSION Superglobal.

Обнаружено прямое использование $ GLOBALS Superglobal.

Рекомендация: используйте соответствующие объекты-оболочки для получения файлов cookie, сеанса или запроса.

Функция set_magic_quotes_runtime () устарела

Рекомендация: устаревшие функции не должны использоваться, поскольку они могут быть удалены в любой момент из будущей версии. [Вероятно, общая ошибка для всех устареваний]

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

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

Рекомендация: используйте оператор === для проверки возвращаемого значения этой функции.

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

Рекомендация: [нет отдельной рекомендации. Я полагаю, что это должно предотвратить exec через кавычки.]

Отсутствует метод ACL _isAllowed () в классе [ClassName].

Рекомендация: очень тщательно управляйте настройкой, управлением и обработкой привилегий. Ресурс ACL должен быть определен в файле adminhtml.xml для каждого контроллера adminhtml, и должен быть реализован метод _isAllowed ().

Пространство имен для класса [ExceptionClassName] не указано.

Рекомендация: укажите пространство имен Exception.

Ошибка синтаксиса PHP: удалена ссылка на время вызова

Рекомендация: исправьте синтаксическую ошибку. [Этот сопровождает вышесказанное. Я полагаю, что аналогичная общая ошибка дается для всех других ошибок синтаксиса PHP]

Возможно нарушение дизайна Magento 2. Обнаружена типичная конструкция Magento 1.

Рекомендация: [Это не дает никаких рекомендаций, но описывает код, в котором обнаружено использование классов, таких как Mage :: blah или Mage_blah_blah :: blah - это классы, которые существуют только в Magento 1 и не будут работать в Magento 2. Хорошей идеей является найдите в своем расширении M2 регулярное выражение Mage(\b|_)для предварительной проверки использования M1.]

ресурс является зарезервированным словом в PHP 7.

Рекомендация: [Нет отдельной рекомендации. Простое переименование слова во что-то другое должно работать. Я полагаю, что эта ошибка существует для всех зарезервированных слов.]

Открывающий тег PHP должен быть первым содержимым файла

Рекомендация: удалите все символы перед открывающим тегом PHP.

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

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

Рекомендация: следует использовать метод объекта ответа setBody ().

Использование эхо-языковой конструкции не рекомендуется.

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

Рекомендация: архитектура расширения должна быть изменена, чтобы избежать использования echo, header и т. Д. В классах, рассмотрите возможность использования метода setBody () объекта ответа.

Использование eval () не рекомендуется

Рекомендация: избегайте использования eval ().


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

Конечно, в будущем это правило может быть ужесточено, и набор правил codeniffer постоянно пересматривается, поэтому определение количества предупреждений, которые вы можете разрешить, всегда является хорошим планом. Предупреждения могут также указывать на системные проблемы с вашей кодовой базой.


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

Такие вещи, как нарушения копирования-вставки и обнаруженные вредоносные программы, будут содержать только сообщения, отображаемые в электронном письме, которое вы получите, сообщая, что ваше расширение не было принято, поэтому внимательно прочитайте письмо .

Архив этих электронных писем в настоящее время не виден на портале для разработчиков, поэтому, если вы удалите их, не читая, или отправите их на нежелательную почту, они исчезнут.

Рецензенты Magento 1-го уровня иногда помещают дополнительную информацию в это электронное письмо, либо просто полезные вещи, о которых, как они думали, вы, возможно, захотите узнать, например, «этот ключ массива« sever », вероятно, должен быть« сервером »», либо обоснования их отклонения и предложения о том, как его быстро решить, например: «Вы скопировали весь файл ядра Magento и просто изменили путь к классу: вместо этого вы можете заменить его настройкой предпочтения класса». или «Вы скопировали весь файл ядра Magento просто для изменения пары публичные функции: вместо этого вы можете использовать плагины ".

Если вы не читаете их и просто просматриваете отчет codeniffer, вы можете попытаться исправить неправильные проблемы.


Обратите внимание, что unescaped output detectedсообщение НЕ должно быть уклонено с помощью комментариев @escapeNotVerifiedили @noEscape. Это, вероятно, будет запрещено в будущих версиях Magento. Вместо этого используйте одно из следующего:

  • Любая статическая строка в одинарных кавычках.
  • Статическая строка в двойных кавычках, без встроенных переменных.
  • [рекомендуется] значение А отделался одним из методов эвакуации из \Magento\Framework\View\Element\AbstractBlock( escapeHtml(), escapeUrl(), escapeQuote(), escapeXssInUrl()).
  • Значение, приведенное к числовому типу (по крайней мере, bool и int, может быть, другие?)
  • Любой вызов метода со словом "html" в названии, например printBannerHtml(). Не злоупотребляйте этим! Убедитесь, что ваш blahHtml()метод действительно корректно экранирует все переменные.
Деви Морган
источник
мое расширение отображает предупреждение, но ничего из вышеперечисленного, так возможно ли, чтобы мое расширение было отклонено из-за предупреждения?
Санджай Гохил
Я отправил это некоторое время назад - с тех пор могут быть добавлены новые. Когда вы входите в свою учетную запись разработчика, нажимаете на расширение и просматриваете журнал ошибок, какое сообщение вы видите, и на каком уровне они являются ошибками? Если это не уровень серьезности 10, то вам может быть отказано по какой-либо другой причине. Что говорит электронное письмо с отказом?
Деви Морган,
6

Ошибка:

Обнаружен неэкранированный вывод

Ошибка в .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 для http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templates

Sankar_k
источник
Это чрезвычайно плохой стиль программирования. Пожалуйста, не злоупотребляйте командами @noEscapeи @escapeNotValidatedтаким образом: если вы это сделаете, они, скорее всего, будут устаревшими, а затем запрещенными системой MEQP. Смотрите в нижней части моего ответа для широкого спектра лучших способов избежать ваших данных.
Деви Морган
1
@Dewi Morgan: Спасибо за вашу ценную информацию.
Sankar_k