angus
(Angus McLeod)
1
嘿 @david,
关于此弃用背后的思考,有一个快速的问题
弃用通知:不应使用 add_to_serializer 直接覆盖 include_*? 方法
背景:DEV: Improve add_to_serializer include_* options (#21220) · discourse/discourse@26b7f8a · GitHub
我理解希望将用户迁移到 add_to_serializer 方法的标准用法中的 include_condition 参数,即添加他们自己的序列化器方法。
然而,在某些情况下,插件可能希望向序列化器添加一个 include_* 方法,这与该情况不符,即当你没有确定自己的自定义属性是否包含在内,而是覆盖核心序列化器中的 include_* 方法时,例如:
核心方法:discourse/app/serializers/site_serializer.rb at main · discourse/discourse · GitHub
我承认,可以重新考虑该特定用法,使其不需要覆盖站点序列化器方法,或者可以通过其他方式实现覆盖,但我想知道以这种方式允许使用 add_to_serializer 方法是否存在固有的缺点,以及弃用是否会导致以这种方式使用该方法被移除。
4 个赞
david
(David Taylor)
2
是的,这是我的建议。
我们最近引入了一个新的系统,用于 ‘插件修改器’,它们是非常廉价的扩展点,与 DiscourseEvent 类似,但它们接受一个输入值并返回一个值。因此,在你的情况下,你可以做一个核心 PR,在相关的 include_ 方法中添加一个 DiscoursePluginRegistry.apply_modifier 调用,然后在你的插件中使用 register_modifier 来覆盖该值。
是的,我们最终可能会完全阻止它。而且你真的不想使用一个在日志中打印弃用噪音的方法。
如果你确实必须在没有核心协作的情况下覆盖一个方法,那么 modify_class 似乎是更好的选择。我们有一个专门的 add_to_serializer 的主要原因是它会自动定义一个 include_* 方法,这样它只在插件启用时才适用。
这意味着你链接的代码片段目前定义了两个方法:include_wizard_required? 和 include_include_wizard_required? 
11 个赞
pfaffman
(Jay Pfaffman)
3
该 Readme 说它“像堆栈一样运行(先进先出)”,但那是一个队列。堆栈是先进后出。(我无法在手机上复制文本)。
4 个赞
Lilly
(Lillian Louis)
4
好,你说得对。栈是 LIFO(后进先出),队列是 FIFO(先进先出)。
这些修饰符的关键特性:
- 在栈中操作(先注册,先调用)
- 插件禁用时自动禁用
- 将所有块调用的累积结果传递给调用者
1 个赞
david
(David Taylor)
5
它更像是一个“中间件堆栈”:一系列按顺序执行的方法,每种方法将其结果传递给下一个方法的输入。
我认为在这里应用 LIFO/FIFO 术语是行不通的:没有东西被添加到“堆栈”中/从中移除——没有“出”。
4 个赞
pfaffman
(Jay Pfaffman)
6
哦。所以不是堆栈数据结构。
我开始说我 1987 年获得了计算机科学学位,不知道人们现在学什么。
2 个赞
Lilly
(Lillian Louis)
7
这就是我的问题所在。我最近有将近 10 年几乎没接触过电脑(在我工作了 25 年之后),感觉就像缺少了一个巨大的知识库部分。
3 个赞
angus
(Angus McLeod)
关闭
8
此主题在上次回复后 30 天自动关闭。不再允许回复。