如何解决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?一定!?
Robbie Averill

它同时使用PSR-1和PSR-2。
Manish


Answers:


31

经过一个小时的研究,我得出了以下清单,它对我认为的每个人都可能有帮助。

一旦发现更多警告/错误,我将尽力使其保持更新:

警告事项

行数超过80个字符;包含X个字符

要么

行数上限为100个字符;包含X个字符

那些是我见过最多的一种,它们很容易说明,这是一种良好的做法,将代码行保持较小以保持干净且可读的代码。

函数调用中的逗号后找不到空格

您已经调用了一个函数,该函数接收参数并且在逗号后没有添加空格。例子:strrchr($bla,".")应该是strrchr($bla, ".")

预期\“ while(...){\ 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 \”不是有效的驼峰格式

每个变量都必须使用驼峰格式,因此$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扩展(甚至用于个人使用)吗?
Siarhey Uchukhlebau,2016年

@SiarheyUchukhlebau是的,这是您在Magento市场上上传扩展后获得的技术报告
Raphael在Digital Pianism

1
You should keep the opening brace on the same line:是不是相反?顺便说一句好消息
Claudiu Creanga,2016年

@ClaudiuCreanga我认为你是对的,让我仔细检查;)
Raphael在Digital Pianism

是否可以推送包含超过10k警告消息的扩展名?还是他们拒绝一切带有警告的内容?
罗兰·索斯(RolandSoó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 Superglobal。

直接检测到$ _GET Superglobal。

检测到直接使用$ _POST Superglobal。

直接检测到$ _REQUEST Superglobal。

直接检测到$ _SESSION Superglobal。

检测到直接使用$ GLOBALS Superglobal。

建议:使用相应的包装器对象以获取cookie,会话或请求数据。

函数set_magic_quotes_runtime()已被弃用

建议:不应使用已弃用的功能,因为它们可能会随时从将来的版本中删除。[可能是所有弃用的通用错误]

相同的运算符===不用于测试strpos函数的返回值

相同的运算符===不用于测试stripos函数的返回值

建议:使用===运算符测试此函数的返回值。

反引号字符串常量的用法不正确。反引号应始终位于字符串内。

建议:[没有单独的建议。我想这是为了防止执行程序通过反引号引起来。]

[ClassName]类中缺少_isAllowed()ACL方法。

建议:非常仔细地管理特权的设置,管理和处理。应该在adminhtml.xml文件中为每个adminhtml控制器定义ACL资源,并应实现_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 Opening Tag之前的所有字符。

不鼓励使用死语构造。

不鼓励使用退出语言构造。

建议:应该使用setBody()响应对象方法。

不鼓励使用echo语言构造。

不鼓励使用印刷语言。

建议:应该更改扩展的体系结构,以避免在类中使用回显,标头等,请考虑使用响应对象的setBody()方法。

不鼓励使用eval()

建议:避免使用eval()。


与导致您的扩展名被拒绝的这些错误不同,当前仅出于礼貌列出警告,以帮助改进扩展名的代码。不会因警告而拒绝您的技术评论,尽管有很多警告。

当然,将来可能会收紧该规则,并且对代码嗅探器规则集进行不断审查,因此,查看可以解决的警告数量始终是一个好计划。警告还可能指示您的代码库出现系统性问题。


拒绝技术评论的某些原因目前尚未显示在在线报告中,仅在电子邮件中给出。

诸如复制粘贴违规和检测到恶意软件之类的消息只会在您收到的电子邮件中显示消息,让您知道您的扩展名未被接受,因此请仔细阅读电子邮件

这些电子邮件的存档当前在开发者门户网站上不可见,因此,如果您删除它们而不阅读,或者将其归档为垃圾邮件,那么它们就消失了。

Magento的1级审阅者有时会在此电子邮件中添加其他信息,或者只是他们认为您想了解的有用信息,例如“此数组键'sever'应该是'server'”,或者被拒绝和建议的理由有关如何快速解决该问题的信息,例如“您复制了整个Magento核心文件并只是更改了类路径:您可以将其替换为类首选项设置。”或“您复制整个Magento核心文件只是为了更改几个公共功能:您可以为此使用插件。”

如果您不阅读这些内容,仅查看codeniffer报告,则可能最终试图解决错误的问题。


请注意,unescaped output detected不应使用@escapeNotVerified@noEscape注释来躲避该消息。Magento的未来版本中可能不允许这样做。而是,使用以下之一:

  • 单引号中的任何静态字符串。
  • 带双引号的静态字符串,没有内联变量。
  • [推荐]的值逃脱了与从中逸出的方法之一 \Magento\Framework\View\Element\AbstractBlockescapeHtml()escapeUrl()escapeQuote()escapeXssInUrl())。
  • 将值转换为数字类型(至少是bool和int,也许还有其他类型?)
  • 名称中带有单词“ html”的任何方法调用,例如printBannerHtml()。不要滥用这个!确保您的blahHtml()方法确实正确地转义了所有变量。

我的分机显示警告,但以上均不显示,因此我的分机是否可能因为警告而被拒绝?
Sanjay Gohil

我在不久前发布了此内容-从那时起可能会添加新的。登录开发人员帐户时,单击扩展名,然后查看错误日志,看到的消息是什么,它们是什么级别的错误?如果它们的严重性不是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;">

有关http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templates的信息,请参阅模板XSS安全性。


这是极其糟糕的编程风格。请不要以这种方式滥用@noEscapeand @escapeNotValidated命令:如果这样做,则MEQP系统可能会弃用和禁止它们。请参阅我的答案的底部,以获取各种更好的转义数据方法。
Dewi Morgan

1
@Dewi Morgan:感谢您提供宝贵的信息。
Sankar_k
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.