跳到内容
新问题

对这个项目有疑问吗?注册一个免费的GitHub帐户以打开一个问题,并联系其维护者和社区。

单击“注册GitHub”,表示您同意我们的服务条款隐私声明。我们偶尔会向您发送与帐户相关的电子邮件。

已经在GitHub上了?登录到您的帐户

禁止使用某些函数和类 #57738

已合并

对话

安东·弗拉森科
复制链接
贡献者

什么?

本公关介绍了禁止的功能和类闻。
它旨在对古腾堡项目中的特定类和函数实施使用限制。
虽然允许声明这些类/函数,但它们的实际使用受到定义的正则表达式的限制。

修复 #54745.

为什么?

此PR的必要性源于避免在块库包中使用任何Gutenberg函数和类的需要。
这是因为这些包是向后移植到Core的,不能包含Gutenberg相关的函数和类。

怎么用?

实现包括为受限类和函数定义正则表达式。
这个禁止功能和类别嗅探类钩住PHP CodeSniffer进程,扫描代码以查找使用这些受限类或函数的实例。

测试说明

  1. 确保GitHub CI作业通过。
  2. 引导到test/php/gutenberg编码标准/.
  3. 运行作曲家更新.
  4. 运行编写器运行全部检查.

键盘测试说明

屏幕截图或屏幕广播

@安东·弗拉森科 安东·弗拉森科补充这个[类型]代码质量 与代码质量相关的问题或PR标签2024年1月10日
复制链接

github-操作 机器人程序 评论2024年1月11日

在中检测到片状测试0c8参考69.
一些测试通过,但尝试失败。失败可能与此提交无关,但仍会报告以供查看。请参见文档了解更多信息。

🔍 工作流运行URL:https://github.com/WordPress/gutenberg/actions/runs/7717914499
📝 报告的问题:

@安东·弗拉森科 安东·弗拉森科将此拉入请求标记为已准备好进行审阅 2024年1月17日16:42
@安东·弗拉森科
复制链接
贡献者 作者

PR未通过CI检查,因为块库包中不允许使用某些功能。需要澄清是忽略还是重构这些函数。

有问题的函数/类列表:

文件:/src/wp-content/plugins/gutenberg/packages/block-library/src/form/index.php----------------------------------------------------------------------------------------------------------------------发现2个影响2条线路的错误----------------------------------------------------------------------------------------------------------------------49 |错误|不允许调用“gutenberg_is_terial_enabled()”函数,因为它的名称与||禁止模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)204|ERROR|不允许调用“gutenberg_is_terial_enabled()”函数,因为它的名称与||禁止模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)----------------------------------------------------------------------------------------------------------------------文件:/src/wp-content/plugins/gutenberg/packages/block-library/src/FILE/index.php----------------------------------------------------------------------------------------------------------------------发现影响3条线路的3个错误----------------------------------------------------------------------------------------------------------------------25|ERROR|不允许调用“gutenberg_enqueue_module()”函数,因为它的名称与禁止的名称匹配||模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)111 |错误|不允许调用“gutenberg_register_module()”函数,因为它的名称与禁止的匹配||模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)113|ERROR|不允许调用“gutenberg_url()”函数,因为其名称与禁止的模式匹配:||“/^(G|G)utenberg.*$/”。(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)----------------------------------------------------------------------------------------------------------------------文件:。。。src/wp-content/plugins/gutenberg/packages/block-library/src/navigation/index.php----------------------------------------------------------------------------------------------------------------------发现影响3条线路的3个错误----------------------------------------------------------------------------------------------------------------------341|ERROR|不允许使用“Gutenberg_Navigation_Fallback”类,因为其名称与禁止的名称匹配||模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasss.UsedClassInvalid)431|ERROR|不允许调用“gutenberg_register_module()”函数,因为其名称与禁止的名称匹配||模式:“/^(G|G)utenberg.*$/”。||(古腾堡.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunctionInvalid)433|ERROR|不允许调用“gutenberg_url()”函数,因为其名称与禁止的模式匹配:||“/^(G|G)utenberg.*$/”。(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)----------------------------------------------------------------------------------------------------------------------文件:/src/wp-content/plugins/gutenberg/packages/block-library/src/image/index.php----------------------------------------------------------------------------------------------------------------------发现影响3条线路的3个错误----------------------------------------------------------------------------------------------------------------------55|ERROR|不允许调用“gutenberg_enqueue_module()”函数,因为它的名称与禁止的匹配||模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)362|ERROR|不允许调用“gutenberg_register_module()”函数,因为其名称与禁止的名称匹配||模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)364|ERROR|不允许调用“gutenberg_url()”函数,因为其名称与禁止的模式匹配:||“/^(G|G)utenberg.*$/”。(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)----------------------------------------------------------------------------------------------------------------------文件:/src/wp-content/plugins/gutenberg/packages/block-library/src/search/index.php----------------------------------------------------------------------------------------------------------------------发现3个错误影响3条线路----------------------------------------------------------------------------------------------------------------------95|ERROR|不允许调用“gutenberg_enqueue_module()”函数,因为其名称与禁止的名称匹配||模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)217|ERROR|不允许调用“gutenberg_register_module()”函数,因为其名称与禁止的名称匹配||模式:“/^(G|G)utenberg.*$/”。||(古腾堡.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunctionInvalid)219|ERROR|不允许调用“gutenberg_url()”函数,因为其名称与禁止的模式匹配:||“/^(G|G)utenberg.*$/”。(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)----------------------------------------------------------------------------------------------------------------------文件:。。。src/wp-content/plugins/gutenberg/packages/block-library/src/form-input/index.php----------------------------------------------------------------------------------------------------------------------发现1个影响1条线路的错误----------------------------------------------------------------------------------------------------------------------35 |错误|不允许调用“gutenberg_is_experity_enabled()”函数,因为它的名称与||禁止模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)----------------------------------------------------------------------------------------------------------------------文件:/src/wp-content/plugins/gutenberg/packages/block-library/src/pattern/index.php----------------------------------------------------------------------------------------------------------------------发现1个影响1条线路的错误----------------------------------------------------------------------------------------------------------------------61|ERROR|不允许调用“gutenberg_serialize_blocks()”函数,因为其名称与禁止的名称匹配||模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)----------------------------------------------------------------------------------------------------------------------文件:/src/wp-content/plugins/gutenberg/packages/block-library/src/query/index.php----------------------------------------------------------------------------------------------------------------------发现2个影响2条线路的错误----------------------------------------------------------------------------------------------------------------------73|ERROR|不允许调用“gutenberg_enqueue_module()”函数,因为其名称与禁止的名称匹配||模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)141|ERROR|不允许调用“gutenberg_register_module()”函数,因为它的名称与禁止的匹配||模式:“/^(G|G)utenberg.*$/”。||(古腾堡.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunctionInvalid)----------------------------------------------------------------------------------------------------------------------文件:。。。wordpress.test/src/wp-content/plugins/gutenberg/packages/block-library/src/form-submission-notification/index.php----------------------------------------------------------------------------------------------------------------------发现1个影响1条线路的错误----------------------------------------------------------------------------------------------------------------------38 |错误|不允许调用“gutenberg_is_experity_enabled()”函数,因为它的名称与||禁止模式:“/^(G|G)utenberg.*$/”。||(Gutenberg.CodeAnalysis.RestrictedFunctionsAndClasses.CalledFunction无效)----------------------------------------------------------------------------------------------------------------------

@安东·弗拉森科
复制链接
贡献者 作者

我很感激您对此的反馈,@吉奥罗牌手表.
嗅觉是否应该忽略这些函数/类?或者应该将其从块状布雷里包装?
此外,关于嗅探本身的任何反馈都会有所帮助。
它是否按预期工作?
有什么需要修复、调整或实施的吗?谢谢!

@吉奥罗牌手表
复制链接
成员

我很感激你对此的反馈,@吉奥罗牌手表.
嗅觉是否应该忽略#57738(评论)函数/类?还是应该将其从区块库包中删除?

嗅探可以很好地检测所有列出的违规行为👍

其中一些代码路径在检查之后,确保它们只在Gutenberg上下文中执行,这样人们就可以显式地禁用这些行的违规行为。

看起来WordPress核心中的其他调用将失败,如以下无条件调用gutenberg_is_experimental_enabled()这就是嗅觉最有帮助的地方。

总的来说,我觉得这个新规则非常有用,因为它会提醒人们默认使用WordPress核心中可用的语法。

@安东·弗拉森科
复制链接
贡献者 作者

@吉奥罗牌手表我非常感谢你的反馈。
我已经改进了嗅探,因此现在它可以检测函数/类是否受到保护(即在Gutenberg上下文中调用),而不会抛出错误。
此外,为了使PR通过CI检查,我添加了临时//phpcs:忽略报表(请参见参考5388f).

这种说法的一个例子是:

//需要重构:必须保护此函数,因为它只在古腾堡可用,而不在核心中。

我计划创建另一个GitHub问题,专门解决合并此PR后这些事件的重构。

如果PR在代码和功能方面对您来说都很好,我可以请求您的批准吗?🙏

wp_寄存器_脚本_模块(
“@wordpress/block-library/file”,
定义(“IS_GUTENBERG_PLUGIN”)&&IS_GUTENBERG_PLUGIN?gutenberg_url('/build/interactivity/file.min.js'):includes_url('块/文件/view.min.js'),
$module_url??includes_url('块/文件/view.min.js'),
复制链接
贡献者

@阿佐兹 阿佐兹 2024年1月26日

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

似乎这在PHP 7.0+中应该可以工作。只是不确定古腾堡是否还必须支持5.6?

复制链接
贡献者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

根据插件目录.有整个讨论关于WP是否“正式”支持空合并操作符,但我认为现在我们应该可以开始使用它😅

复制链接
成员

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

您始终可以初始化$模块_url之前IS_GUTENBERG_PLUGIN公司选中此处以避免条件。

复制链接
贡献者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

根据插件目录.有整个讨论关于WP是否“正式”支持空合并操作符,但我认为现在我们应该可以开始使用它😅

空合并运算符尚未被WordPress编码标准接受。有一张Trac的票要开.

在Core中接受此票据或其建议(以及其他PHP 7.0语法)之前,请不要将其用于将要合并到Core中的代码。为什么?一旦到达核心,它将被移除。

因此,为了简化GB和Core之间的同步过程,我建议暂时不要使用它。

复制链接
贡献者 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

考虑到空合并操作符在古腾堡代码库中的广泛使用,我认为它可以用于古腾堡:https://github.com/search?q=repo%3AWordPress%2Fgutenberg+路径%3A*.php+语言%3APH+%3F%3F&type=code&ref=advsearch.
但我没有检查它是否真的被允许。
我同意@希腊罗马帝国,我们不要使用??直到它在Core中被正式接受(并感谢与Trac讨论的链接)。
固定在1b61304a422ff9d8bd1f1bbdf30215f3b1ff75ce中。

复制链接
贡献者 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

您始终可以初始化$模块_url之前IS_GUTENBERG_PLUGIN公司选中此处以避免条件。

我不想在IS_GUTENBERG_PLUGIN公司检查与绩效相关的原因。但是的,这是一种选择。

复制链接
贡献者

@告诉机器 告诉机器 留下了评论

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

谢谢你的公关,这看起来不错!我认为我们应该尝试合并它,看看它是如何工作的,然后根据需要进行迭代。而且,看起来要做的大多数重构都是在实验块中完成的,而这些实验块并没有进入6.5,所以我们的代码库总体上似乎处于一个良好的位置😄

$conditions=array_reverse($tokens[$stack_pointer]['conditions'],true);

//匹配“if(defined('IS_GUTENBERG_PLUGIN')&&IS_GUTENBERG_PLUGIN”字符串。
$regexp='/if\s*\(\s*defined\(\s*(\'|“)IS_GUTENBERG_PLUGIN(\'|'”)\s*\)\s*&\s*IS_GUTENBERG_PLUGIN/';
复制链接
贡献者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

我想知道是否有理由让这个检查可配置?正在检查IS_GUTENBERG_PLUGIN公司在block_library或任何其他可能从npm包在核心中自动生成的PHP文件中都有意义。我想,如果我们在插件特定的PHP文件中使用嗅探,那么这种逻辑根本就不需要。

复制链接
贡献者 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

嗅探当前仅检查/包/块库文件夹:https://github.com/WordPress/gutenberg/pull/57738/files#diff-05ae9cddcaec1e845771a7db224961439f83ef5939ec67d3a48744cb34d7e58bR157
因此,它不会检查其他文件夹中的文件。
我希望我正确地理解了你的问题。

@@-980,6+980,8@@函数块_引用_导航_获取_回调_块(){
if(class_exists('WP_Navigation_Fallback')){
$navigation_post=WP_navigation_Fallback::get_Fallback();
}其他{
//需要重构:必须保护这个类,因为它只在古腾堡可用,而在核心中不可用。
//phpcs:忽略Gutenberg.CodeAnalysis。禁止功能和类。禁止使用ClassUsage
复制链接
成员

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

这是唯一具有phpcs:忽略包含要同步到WP核心的注释。如果没有定义规则,它会正常工作吗?我只是不知道PHPCS是如何工作的,所以答案很简单。

复制链接
贡献者 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

如果未定义被忽略的规则,则不会生成任何错误。
然而,我已经将这些移动到phpcs.xml.dist公司中的文件255e3天以避免将代码与phpcs:忽略声明。我希望这些文件能尽快重构,以便删除排除模式声明。

线条上的注释160163
<元素值=“(G|G)utenberg.*”/>
</属性>
<property name=“forbidden_classes”type=“array”>
<元素值=“(G|G)utenberg.*”/>
复制链接
成员

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

Nit:从技术上讲,使用以下内容就足够了:

建议的更改
<要素 价值=(G|G)乌滕贝格.*/>
</财产>
<财产 名称=禁止类 类型=阵列>
<要素 价值=(G|G)乌滕贝格.*/>
<要素 价值=古腾堡.*/>
</财产>
<财产 名称=禁止类 类型=阵列>
<要素 价值=古腾堡.*/>

不过,也许我错过了一些特殊情况。

复制链接
贡献者 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

你是对的。
然而,为了安全起见,我更愿意让第一个字母是“G”或“G”。
这只是我个人的喜好。

复制链接
成员

@齐奥罗 吉奥罗牌手表 留下了评论

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

这是一个很好的开始。我留下了几个小毛病要考虑,但没有一个是拦截器。这对于WordPress Core中的Gutenberg同步应该是一个很大的帮助,因为到目前为止,它一直在编辑器的发布引导中捕捉这些代码路径。

@你知道riad@格特戴夫,根据目前为止WP 6.5版本中的经验,我们可能会错过什么?

@你知道riad
复制链接
贡献者

干得好👍 这将对我们有很大帮助。

线条上的注释983984
//需要重构:必须保护这个类,因为它只在古腾堡可用,而在核心中不可用。
//phpcs:忽略Gutenberg.CodeAnalysis。禁止功能和类。禁止分类使用
复制链接
贡献者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

@tjcafferkey公司 @奥卡姆我们是否向古腾堡_在最近关于Nav块中挂钩的工作中,这个类的前缀版本是什么?

复制链接
贡献者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

我要把这个搬进去#58369我根本不知道这个类是在哪里定义的。

复制链接
贡献者

@格特戴夫 格达韦 留下了评论

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

干得好。这会有很大的不同。合并和迭代👍

如果有人(我)提出问题来跟踪解决您不得不解决的未决案件,这会有帮助吗忽视在这里?最好能解决这些问题。

@安东·弗拉森科 安东·弗拉森科 用力推动的这个 try/forbidd-calling-disallowed-functions-sniff 分支 d185d8f 1b61304号 比较 2024年1月30日18:16
@安东·弗拉森科 安东·弗拉森科 用力推动的这个 try/forbidd-calling-disallowed-functions-sniff 分支 1b61304号 8249699 比较 2024年1月30日19:54
@安东·弗拉森科
复制链接
贡献者 作者

干得好。这会有很大的不同。合并和迭代👍

如果有人(我?)提出问题来跟踪解决您不得不解决的未决案件,这会有帮助吗忽视在这里?最好能解决这些问题。

@格特戴夫令人惊叹的。是的,请继续创建GitHub问题以跟踪未决案件的解决。
仅供参考,我已经将ignore语句移到了中的phpcs.xml.dist文件中255e3天.

@安东·弗拉森科 安东·弗拉森科合并提交第7页,共9023页进入之内 大旅行箱 2024年1月31日
通过55项检查
@安东·弗拉森科 安东·弗拉森科删除了 尝试/禁止调用不允许的函数sniff 分支 2024年1月31日13:19
@安东·弗拉森科
复制链接
贡献者 作者

谢谢大家!

免费注册 在GitHub上加入此对话.已经有帐户了吗?登录以发表评论
标签
[类型]代码质量 与代码质量相关的问题或PR
项目
还没有
7名参与者