如何修复 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 (...) { \";发现\“而(...)\ n {\ n \”
预期 \"foreach (...) { \";找到\"foreach (...) { \"
预期 \"if (...) { \";发现\“如果(...)\ n {\ n \”
预期 \"} 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”不是有效的驼峰大写格式
每个变量都必须使用驼峰大写格式,所以 $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
旗帜。
避免始终为 true 或 false 的 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 提交过程中运行的规则集并不总是完全同步(当然,这是理想的情况),因此即使它通过了 Github 上的最新版本,您也可能会因 Codeniffer 错误而被拒绝。
一些更常见的“严重性 10”错误(您的扩展将被拒绝的唯一错误)及其列出的建议包括:
PHP 文件末尾不允许有结束标记
推荐:删除 PHP 结束标记。
禁止调用时按引用传递调用
推荐:阅读 PHP 5 中的参考文档并重构您的代码。参考: http://php.net/manual/en/language.references.pass.php
检测到直接使用 $_ENV 超级全局。
检测到直接使用 $_GET 超级全局。
检测到直接使用 $_POST 超级全局。
检测到直接使用 $_REQUEST 超全局。
检测到直接使用 $_SESSION 超全局。
检测到直接使用 $GLOBALS 超级全局。
推荐:使用相应的包装对象来获取 cookie、会话或请求数据。
函数 set_magic_quotes_runtime() 已被弃用
推荐:不应使用已弃用的函数,因为它们可能随时从未来版本中删除。[可能是所有弃用的通用错误]
相同的运算符 === 不用于测试 strpos 函数的返回值
相同的运算符 === 不用于测试 stripos 函数的返回值
推荐:使用 === 运算符来测试该函数的返回值。
反引号字符串常量的使用不正确。反引号应始终位于字符串内。
推荐:[没有单独的推荐。我想这是为了防止通过反引号执行。]
[ClassName] 类中缺少 _isAllowed() ACL 方法。
推荐:非常仔细地管理权限的设置、管理和处理。应在每个 adminhtml 控制器的 adminhtml.xml 文件中定义 ACL 资源,并应实现 _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() 响应对象方法。
不鼓励使用 echo 语言构造。
不鼓励使用打印语言构造。
推荐:应更改扩展的体系结构以避免使用 echo、标头等。在类中,考虑使用响应对象的 setBody() 方法。
不鼓励使用 eval()
推荐:避免使用 eval()。
与这些导致您的扩展程序被拒绝的错误不同,当前列出的警告只是出于礼貌,以帮助改进您的扩展程序的代码。无论警告有多少,您都不会因警告而被技术审查拒绝。
当然,这条规则将来可能会收紧,并且 codeniffer 规则集正在不断审查,因此看看您可以解决多少警告始终是一个好的计划。这些警告还可以表明您的代码库存在系统性问题。
技术审查被拒绝的一些原因目前并未显示在在线报告中,仅在电子邮件中给出。
诸如复制粘贴违规和检测到的恶意软件之类的事情只会在您收到的电子邮件中显示消息,让您知道您的扩展程序未被接受,因此 仔细阅读电子邮件.
目前,这些电子邮件的存档在开发者门户中不可见,因此,如果您在未阅读的情况下删除它们,或者将它们归档到垃圾邮件中,那么它们就会消失。
Magento 的 1 级审阅者有时会在这封电子邮件中添加额外的信息,要么只是他们认为您可能想了解的有用信息,例如“这个数组键 'sever' 可能应该是 'server'”,或者是他们拒绝的理由和建议关于如何快速解决它,例如“您复制了整个 Magento 核心文件并刚刚更改了类路径:您可以将其替换为类首选项设置。”,或“您复制了整个 Magento 核心文件只是为了更改几个公共函数:您可以使用插件来代替。”
如果您不阅读这些内容,而只查看 codeniffer 报告,您可能最终会尝试修复错误的问题。
请注意, 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;">
.