Grav Admin中Flex对象保存时是否存在对应Admin事件钩子?
Grav Flex对象写入前的自定义修改钩子说明
Flex对象存在和onAdminSave作用类似的事件钩子,完全支持在数据写入文件系统等持久化存储前做自定义修改,常用的钩子有三类:
- 通用保存前钩子
onFlexObjectSave
这是Flex体系全局生效的保存前事件,触发时机在数据校验完成、正式写入存储之前,所有Flex对象(不管是系统自带还是自定义的)触发保存操作时都会走到这个钩子。回调中可以通过$event['object']拿到当前操作的对象实例,直接修改对象属性即可,修改后的值会自动带入后续写入流程。使用时建议先判断对象的Flex类型,避免误修改其他业务的Flex数据。 - 特定类型专属保存钩子
onFlexObjectSave[类型标识]
如果只需要处理某一类固定的Flex对象,可以用更精准的类型专属事件,不需要额外做类型判断。比如要处理类型标识为customer_records的自定义Flex对象,对应的钩子就是onFlexObjectSaveCustomerRecords,只有保存该类型对象时才会触发回调,逻辑更清晰,性能也更好。 - 后台场景专属钩子
onAdminFlexBeforeSave
这个钩子仅在Grav Admin后台触发Flex对象保存操作时生效,前台接口、自定义代码触发的Flex保存不会触发该事件,适合仅需要干预后台编辑保存逻辑的场景。
注意:不要在上述保存前的钩子回调中直接调用对象的
save()方法,会触发循环调用导致报错。如果需要终止后续保存流程,直接调用$event->stopPropagation()即可。
基础使用示例(插件中注册使用):
// 插件主文件中注册事件 public static function getSubscribedEvents(): array { return [ 'onFlexObjectSave' => 'handleFlexBeforeSave' ]; } // 保存前自定义处理逻辑 public function handleFlexBeforeSave($event) { $flexObj = $event['object']; // 仅处理自定义的文章笔记类型Flex对象 if ($flexObj->getType() !== 'article_notes') { return; } // 自动写入最后修改时间、清理正文内容的危险标签 $flexObj->last_modified = time(); $flexObj->content = htmlspecialchars($flexObj->raw_content, ENT_QUOTES); }
内容的提问来源于stack exchange,提问作者Benni
相关产品推荐
相关产品推荐

