为什么在保存操作时多次调用 Dokuwiki IO_WIKIPAGE_SAVE 动作插件?

Why is Dokuwiki IO_WIKIPAGE_SAVE action plugin called multiple times on a Save operation?

我第一次尝试编写 Dokuwiki 插件是为了 Action 事件,当编辑的页面被保存到磁盘时。我写了一个扩展 DokuWiki_Action_Plugin 的动作插件 class;它包含一个 register 向控制器注册两个挂钩的方法:

$controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'handle_pagewrite_before', array());
$controller->register_hook('IO_WIKIPAGE_WRITE', 'AFTER', $this, 'handle_pagewrite_after', array());

("before"方法在页面内容写入前调用,"after"方法在页面内容写入后调用。)

我已经为 handle_pagewrite_beforehandle_pagewrite_after 这两种方法编写了存根。我在所有三个存根中放入 dbglog 调用以记录进入和退出。

我从 wiki 访问了一个页面,并对其进行了编辑。此时我看到 three 来自 register 方法的调试消息出现在 data/cache/debug.log 中。在我第一次击键进入编辑器时,出现了来自 register 的第四条调试消息。当我单击 Save 保存页面时,会出现第五条 register 消息,然后是来自挂钩的两组消息,而我本以为只有一组,然后是更多register 封邮件。总之,

21:32:34 10.0.1.24: Enter gloss:action:register
21:32:34 10.0.1.24: Enter gloss:action:register
21:32:34 10.0.1.24: Enter gloss:action:register
21:33:56 10.0.1.24: Enter gloss:action:register
21:35:46 10.0.1.24: Enter gloss:action:register
21:35:46 10.0.1.24: Enter gloss:action:handle_pagewrite_before
21:35:46 10.0.1.24: Exit gloss:action:handle_pagewrite_before
21:35:46 10.0.1.24: Enter gloss:action:handle_pagewrite_after
21:35:46 10.0.1.24: Exit gloss:action:handle_pagewrite_after
21:35:46 10.0.1.24: Enter gloss:action:handle_pagewrite_before
21:35:46 10.0.1.24: Exit gloss:action:handle_pagewrite_before
21:35:46 10.0.1.24: Enter gloss:action:handle_pagewrite_after
21:35:46 10.0.1.24: Exit gloss:action:handle_pagewrite_after
21:35:46 10.0.1.24: Enter gloss:action:register
21:35:46 10.0.1.24: Enter gloss:action:register
21:35:47 10.0.1.24: Enter gloss:action:register

为什么会有这么多看似多余的电话?这正常吗?

每次初始化插件系统时都会调用您的插件注册方法。由于 PHP 是基于请求的,因此每次请求都会发生。加载页面会创建多个请求(页面、JS 调度程序、CSS 调度程序、索引 webbug、ajax 调用等)。

你的第二个问题在这里得到回答:

On update to an existing page this event is called twice, once for the transfer of the old version to the attic (rev will have a value) and once to write the new version of the page into the wiki (rev is false)

https://www.dokuwiki.org/devel:event:io_wikipage_write