-2

我怎样才能让投票给“授予”的选民,内部事件订阅者?有没有我可以获取和使用的服务?

我的用例。我的应用程序有两个选民:主要选民和管理员选民。当主要选民不允许访问但管理员选民允许访问时,我想显示额外的 Flash 消息。我可以通过两种不同的解决方案来解决这个问题:通过在管理员投票者内部调度事件或通过在投票者内部设置 flash msg - 但我想避免它,因为我需要确保只有一个投票者投票支持访问。

4

1 回答 1

2

因此,我将从解决您提出的问题的解决方案开始。我将以解决(恕我直言)潜在问题的方法结束。

非常简单的解决方案:

将两个选民合并为一个,替换他们两个。如果满足您的条件,则设置 Flash 消息是该合并选民的责任,但这很简单,因为您拥有两个选民的“结果”......

稍微雄辩:

创建一个 CombinedVoter,替换两者。CombinedVoter 将接收两个选民作为依赖项并将投票请求转发给他们并返回/投射它们的适当组合(因此本质上是一个伪装成选民的 AccessDecisionManager)。当你的条件得到满足时,选民显然会设置闪光信息。

有点没用:

创建一个 CombinedVoter,不替换任何东西,但仍然接收两个选民作为依赖项,将投票请求转发给他们并在所有情况下返回 ABSTAIN。当你的条件得到满足时,选民显然会设置闪光信息。

有点过度设计:

将 EventDispatcher 添加到两个 Voter 并发送投票事件。让侦听器侦听这些事件,并在收到第二个事件(脏 af)时触发,或者在内核事件上再次触发以在满足您的条件时设置 flash 消息。

略微过度设计:

添加一个也是 EventListener 的服务,它侦听相同的内核事件以设置 flash 消息,但不侦听投票事件,而是将该服务注入两个投票者并直接在该服务上设置投票结果通过setAdminVote()/setMainVote()或其他方式。

根本问题:

从语义上讲,您的选民并不关心即时消息和其他选民投票的内容。这既不是他们的目的,也不是他们的责任。将其添加到他们的功能是恕我直言,这是错误的时间和地点!(语义!)

相反,既然这可能是一条特殊消息,为什么不将它添加到您的基本模板中(当然有方法可以检查某人是否是管理员但“主要选民”不允许,例如is_granted在模板中使用或app.user.roles直接使用(如果合适)。您还可以编写一个小树枝扩展,添加该功能并以某种方式使用两个选民。

为什么我建议将这个逻辑放在模板中:因为这是一个显示问题。您希望显示某些内容,因此应将其放置在应用程序的显示部分。此外,您可能会忽略、不知道或努力避免许多边缘情况:在会触发 flash 消息的页面上提交表单可能会在 POST 上添加 flash 消息(如果完成得干脆触发重定向到带有 GET 的页面)并在以下 GET 上,实质上添加了两条 Flash 消息。现在您不能在 POST 请求上添加 flash 消息,但是无效的 POSTED 表单将没有 flash 消息(因为没有 GET)。这是一个头脑f ***。我真的建议不要这样做。

显示是前端的工作,在服务/扩展中添加一些助手。让选民保持他们的单一责任(这当然不是添加闪存消息)。可能将您的基本模板扩展为“使用扩展基本模板的页面应该显示消息”,然后在要显示消息的页面上使用它。

真的,干净利落地这样做;o)

附录:

Flash 消息通常用于向用户提供对他最近执行的操作的反馈。例如,用户删除了一篇博文。然后 Flash 消息应为“博客文章已删除”(它可能包含更多信息 ^^)。

会话闪存包的实用性是这样的概念,即闪存消息将保留在那里,直到它们被检索到。这样便于反馈,因为通常在下次实际渲染页面时才会渲染。

在很多情况下,否则这将难以管理。如果您只加载页面的片段(也许是 ajax 刷新的东西),不希望您的 flash 消息在那里,也不会被删除。如果您发布了一个表单并成功重定向到某个完全不相关的页面怎么办。该页面是否应该知道用户来自哪里?最好不要(关注点分离)。Flash 消息不在乎(单一责任)。开发人员决定可以在哪里显示 Flash 消息(通常在“整页渲染”上或如果专门访问)。

它们也不是灵丹妙药。如果您打开了多个浏览器选项卡,它们可能会令人困惑(因为可能会显示来自另一个选项卡的 Flash 消息)。但是,如果您的网页在浏览器中需要多个选项卡,那么您也会遇到一些其他问题。但是,我觉得接受偶尔的“流浪闪信”是件好事。

于 2019-04-09T21:27:55.887 回答