Як виправити попередження / помилки, висунуті у звіті про технічний огляд Magento Marketplace?


25

З новим Magento Marketplace представлене розширення проходить через кілька станів перевірки, щоб бути затвердженим та доступним через 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 / ...
Абхішек

@raphael ласка це побачити ,: magento.stackexchange.com/questions/71399 / ...
Абхішек

Відповіді:


31

Через годину перегляду звіту я придумав наступний список, який може бути корисним для всіх, хто мені здається.

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

Попередження

Рядок перевищує 80 символів; містить X символів

Або

Рядок перевищує максимальний ліміт - 100 символів; містить X символів

Ті, кого я бачив найбільше, вони пояснюють себе, це хороша практика, щоб рядки кодування були малі, щоб зберегти чистий і читабельний код.

Після коми через функцію виклику функції не знайдено місця

Ви викликали функцію, яка отримує параметри і не додала пробіл після коми. Приклад: strrchr($bla,".")має бутиstrrchr($bla, ".")

Очікується \ "час (...) {\ n \"; знайдено \ "час (...) \ n {\ n \"

Очікуваний \ "foreach (...) {\ n \"; знайдено \ "foreach (...) \ n {\ n \"

Очікується \ "якщо (...) {\ n \"; знайдено \ "якщо (...) \ n {\ n \"

Очікувано \ "} ще {\ n \"; знайдено \ "} \ n ще {\ 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повинно бути$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
Рафаель в Digital Pianism

1
You should keep the opening brace on the same line:чи не навпаки? Чудовий пост до речі
Claudiu Creanga

@ClaudiuCreanga Я думаю, що ти маєш рацію, дозволь мені ще раз перевірити;)
Рафаель у Digital Pianism

Чи можна просунути розширення, яке містить понад 10 к попередження? Або вони відкидають все, що має попередження?
Roland Soós

9

Використання Codesniffer з набором правил MEQP1 або MEQP2 (залежно від вашої версії Magento) дасть вам уявлення про набір правил Magento: https://github.com/magento/marketplace-eqp/tree/master/

Цей набір правил і той, що працює в процесі подання на Marketplace, НЕ завжди ідеально синхронізований (хоча, звичайно, це ідеально), тому ви можете відхилити помилки кодування, навіть якщо він передає останню версію на 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

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

Рекомендація: Використовуйте оператор === для тестування повернутого значення цієї функції.

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

Рекомендація: [немає окремої рекомендації. Я думаю, що це запобігання виконанню за допомогою зворотних цитат.]

Відсутній метод ACL _isAllowed () у класі [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.]

ресурс - це зарезервоване слово в PHP 7.

Рекомендація: [Без окремих рекомендацій. Просто перейменування слова на щось інше повинно працювати. Я думаю, що ця помилка існує для всіх зарезервованих слів.]

Відкриваючий тег PHP повинен бути першим вмістом у файлі

Рекомендація: Видаліть усі символи перед тим, як відкрити тег PHP.

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

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

Рекомендація: слід використовувати метод об'єкта відповіді setBody ().

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

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

Рекомендація: Архітектуру розширення слід змінити, щоб уникнути використання ехо, заголовка тощо у класах, розглянути можливість використання методу setBody () об'єкта відповіді.

Використання eval () не рекомендує

Рекомендація: Уникайте використання eval ().


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

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


Деякі причини відмови від технічного огляду наразі не відображаються в онлайн-звіті та надаються лише в електронній пошті.

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

Архів цих електронних листів наразі не видно на порталі розробників, тому якщо ви видалите їх, не читаючи, або занесіть їх у небажану пошту, то їх уже немає.

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

Якщо ви їх не читаєте, а просто подивитесь на звіт про кодовий кодекс, ви, можливо, спробуєте виправити неправильні проблеми.


Зауважте, що 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


Це надзвичайно поганий стиль програмування. Будь ласка, не зловживайте командами @noEscapeта @escapeNotValidatedкомандами таким чином: якщо ви зробите це, вони, ймовірно, будуть застарені, а потім заборонені системою MEQP. Дивіться внизу моєї відповіді про широкий набір кращих способів уникнути своїх даних.
Деві Морган

1
@Dewi Morgan: Дякуємо за цінну інформацію.
Sankar_k
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.