在活动订阅者内部,如何获得为“已授予”投票的选民?我可以获取和使用任何服务吗?
我的用例。我的应用有两个投票者:主要投票者和管理投票者。当主选民禁止访问但管理员选民允许访问时,我想显示其他Flash消息。 我可以通过两种不同的解决方案来解决此问题:通过在管理员投票者内部调度事件或在投票者内部设置flash msg,但我想避免这种情况,因为我需要确保只有一个投票者对访问进行了投票。
答案 0 :(得分:1)
因此,我将从解决方案开始,回答您提出的问题。我将以解决(IMHO)潜在问题为结束。
将两个选民合并为一个,将其全部替换。如果满足您的条件,则设置闪断消息是合并选民的责任,但这很简单,因为您拥有两个选民的“结果” ...
创建一个CombinedVoter,同时替换两者。 CombinedVoter会同时接收两个投票者作为依存关系,并将投票请求转发给他们,并返回/投射它们的适当组合(因此本质上是伪装成投票者的AccessDecisionManager)。当满足您的条件时,选民显然会设置即插即用消息。
创建一个CombinedVoter,不替换任何东西,但仍将两个投票者都作为依赖者,将投票请求转发给他们,并在所有情况下返回ABSTAIN。当满足您的条件时,选民显然会设置即插即用消息。
向两个投票者添加一个EventDispatcher并发送投票事件。让侦听器侦听这些事件,并在接收到第二个事件(脏污af)时触发,或者在满足您条件的情况下再次触发内核事件以设置闪存消息。
添加一个也是EventListener的服务,该服务监听到同一内核事件以设置即显消息,但不监听投票事件,而是将该服务注入到选民和通过setAdminVote()
/ setMainVote()
或其他方式直接在该服务上设置投票结果。
从语义上讲,您的选民不是故意要关注即时消息和其他选民所投票的内容。这既不是他们的目的也不是他们的责任。恕我直言,将其添加到其功能是错误的时间和地点! (语义!)
相反,由于无论如何这可能都是一条特殊的消息,为什么不将其添加到您的基本模板中(当然,可以使用某些方法来检查某人是否是管理员,但不是“主要投票人”所允许的,例如使用{{3} },也可以直接在模板app.user.roles
中输入(如果适用)。您还可以编写一个小树枝扩展名,添加该功能并以某种方式使用两个投票者。
为什么我建议将此逻辑放在模板中:因为这是一个显示问题。您希望显示某些内容,因此应将其放置在应用程序的显示部分中。另外,您可能忽略了很多边缘情况,或者没有意识到,或者努力避免:在页面上提交触发Flash消息的表单可能会在POST上添加Flash消息(如果干净完成的话)使用GET)和以下GET触发到页面的重定向,实际上是添加了两条Flash消息。现在您无法在POST请求中添加Flash消息,但是无效的POSTED表单将没有Flash消息(因为没有GET)。这是一个想法。我真的会建议反对。
显示是前端的工作,在服务/扩展中添加一些帮助器。让选民承担其单一责任(这当然不是在添加速写消息)。可能会将您的基本模板扩展为“使用扩展的基本模板的页面应显示该消息”,然后在要显示该消息的页面上使用它。
真的,要干净利落; o)
Flash消息通常用于向用户提供有关他最近执行的操作的反馈。例如,用户删除了博客文章。然后,该闪烁消息应显示为“博客帖子已删除”(它可能包含更多信息^^)。
会话Flash包的实用程序是一个概念,即将Flash消息保存在该消息中,直到被检索到为止。这对于反馈很方便,因为它通常在下次 actually 呈现页面时呈现。
在许多情况下,否则很难解决。如果您仅加载页面片段(可能是Ajax刷新的东西),又不想在其中也没有删除Flash消息,该怎么办?如果您发布了表单并成功重定向到某个完全不相关的页面该怎么办。该页面是否应该知道用户的来源?最好不要(关注点分离)。即时消息无关紧要(单一责任)。开发人员决定可以在何处显示Flash消息(通常在“整页呈现”上显示,或者如果要专门访问则显示)。
它们也不是灵丹妙药。如果您打开了多个浏览器选项卡,它们可能会令人困惑(因为可能会显示由另一个选项卡生成的Flash消息)。但是,如果您的网页在浏览器中需要多个选项卡,那么您也会遇到其他问题。但是,我对偶尔出现的“杂讯”表示认可。