zikula / hook-bundle
这是一个整合扩展钩子功能的包。
Requires
- php: >=7.2.5
- symfony/contracts: ^2.3
- symfony/form: ^5.4
- symfony/framework-bundle: ^5.4
- symfony/security-bundle: ^5.4
- symfony/string: ^5.4
- symfony/validator: ^5.4
- zikula/core-bundle: 3.1.0
- zikula/extensions-module: 3.1.0
- zikula/permissions-module: 3.1.0
- zikula/theme-module: 3.1.0
README
这是一个只读仓库。
资源
什么是钩子?
- 钩子是动态在运行时附加到监听器的事件。
- 钩子连接到用户界面中的监听器,并存储在数据库表中。
- 此用户界面允许用户连接/断开连接并更改事件与监听器之间连接的优先级。
- 钩子被通用地用于工作流类型。
钩子事件与标准事件有何不同?
- 事件通过 Symfony 容器中的 EventListeners 或 EventSubscribers 连接到监听器,并且不能通过 UI 随意动态分配。
- 事件具有独特的契约性,且仅适用于单个工作流。
安装
- 如果在 Zikula 中使用此包,则无需执行任何操作,它会自动安装。
- 如果不在 Zikula 中使用此包,您必须创建与
ConnectionEntity
关联的数据库表架构,并且您还必须将此包添加到您的bundles.php
文件中。
钩子事件类型
HookBundle 提供以下抽象钩子事件。还可以轻松创建额外的钩子事件。每个钩子事件还有一个与该事件唯一配对的钩子事件监听器。这种配对定义了事件与监听器之间的契约。
- DisplayHookEvent -> DisplayHookEventListener
- FilterHookEvent -> FilterHookEventListener
- FormHookEvent -> FormHookEventListener
DisplayHookEvent
DisplayHookEvent 通过提供的 twig 函数从 twig 模板中分发 {{ dispatchDisplayHookEvent('HookEventClassname', 'id') }}
DisplayHookEventListeners 必须添加 DisplayHookEventResponse
对象,这些对象将内容添加到模板中的该位置。(例如:在博客文章后显示评论)。
FilterHookEvent
FilterHookEvent 通过提供的 twig 过滤器从 twig 模板中分发 {{ targetString|dispatchFilterHookEvent('HookEventClassname') }}
FilterHookEventListeners 被提供目标字符串,并且可以根据需要修改(或过滤)该字符串。(例如:删除脏话)。
FormHookEvent
在 Symfony 表单工作流中的控制器内部,FormHookEvent 会触发两次。首先是在表单实例化之后,然后是在表单提交并验证之后。FormHookEventListeners 会接收到目标表单,并根据需要修改表单,提供额外的模板,最后处理未绑定的表单数据。(例如:向用户注册表单添加个人资料字段,或在文本字段中添加 WYSIWYG 编辑器)。
实现
实现 HookEvents 和 HookEventListeners 非常简单。只需扩展抽象父类,定义 title
和 info
属性。重要的是,这些类必须在自动配置的目录中,或者分别手动标记为 zikula.hook_event
或 zikula.hook_event_listener
。
监听器需要实现影响变更所需的逻辑。在 DisplayHookEventListener
和 FilterHookEventListener
中,这通过 execute
方法实现。在 FormHookEventListener
中,有两个方法需要逻辑:preHandleExecute
用于在处理 Request
之前修改表单,以及 postSubmitExecute
用于表单提交后。有关每个类的所有属性和方法以及包含的示例代码的更多信息,请参阅。
哲学
钩子连接故意是 通用的 且与更大应用程序或周围的具体功能无关。监听器不知道它们正在监听的具体控制器或模板,也不知道它们可能连接到的内容或表单。监听器不会根据事件是从哪个控制器或模板中派发的而改变其行为/响应。
这是钩子与事件不同的一个方面。如果需要特定的工作流或内容知识,则自定义事件是首选解决方案。相反,钩子监听器以通用的方式对独特的钩子事件做出响应,并在任何钩子事件被派发时提供相同的响应。这些监听器可以通过这种方式在任何应用程序位置的通用方式提供相同的响应。
此协议基于抽象父类 HookEvent,而不是最终的具体类。最终的具体类名将成为独特的事件名称,这样用户界面可以识别分配连接的位置。这就是所谓的通用协议:通过钩子事件通用,这种标准化带来的灵活性才是真正的力量。