Symfony 4:如何获得理所当然投票的选民?
Symfony 4: how to get voters who voted for granted?
如何获得投票给 "granted" 的选民,内部活动订阅者?有没有我可以获取和使用的服务?
我的用例。我的应用程序有两个选民:主要选民和管理员选民。当主要选民不允许访问但管理员选民允许访问时,我想显示额外的闪存消息。
我可以通过两种不同的解决方案解决这个问题:通过在管理员选民内部调度事件或通过在选民内部设置 flash msg——但我想避免它,因为我需要确保只有一个选民投票支持访问。
所以,我将从解决方案开始,以回答您提出的问题。我将以解决(恕我直言)潜在问题作为结尾。
极其简单的解决方案:
将两个选民合并为一个,替换他们两个。如果您的条件得到满足,则设置 flash 消息是该合并选民的责任,但这很简单,因为您拥有两个选民的 "results" ...
稍微多一点eloquent:
创建一个 CombinedVoter,替换两者。 CombinedVoter 将接收两个选民作为依赖项并将投票请求转发给他们并 return / 投射他们的适当组合(因此本质上是一个伪装成选民的 AccessDecisionManager)。当满足您的条件时,选民显然会设置闪现消息。
有点没用:
创建一个 CombinedVoter,不替换任何东西,但仍然接收两个选民作为依赖项,将投票请求转发给他们并在所有情况下 return 弃权。当满足您的条件时,选民显然会设置闪现消息。
有点过度设计:
为两个 Voters 添加一个 EventDispatcher 并发送投票事件。让侦听器侦听这些事件,并在收到第二个事件(脏 af)时触发,或者在满足您的条件时再次触发内核事件以设置 flash 消息。
稍微减少过度设计:
添加一个也是 EventListener 的服务,侦听 相同的内核事件以设置快闪消息,但不侦听投票事件,而是注入为两个选民提供服务,并通过 setAdminVote()
/setMainVote()
或其他方式直接在该服务上设置投票结果。
根本问题:
从语义上讲,您的选民并不意味着关心即显消息和其他选民投票的内容。这既不是他们的目的,也不是他们的责任。将此添加到他们的功能是恕我直言的误导,这是错误的地点和时间! (语义!)
相反,既然这可能是一条特殊消息,为什么不将其添加到您的基本模板中(当然有一些方法可以检查某人是否是管理员但 "main voter" 不允许,例如使用 is_granted
在模板中或直接 app.user.roles
(如果适用)。您还可以编写一个小的 twig 扩展来添加该功能并以某种方式使用两个选民。
为什么我建议将此逻辑放在模板中:因为这是一个显示问题。你想要显示一些东西,所以它应该放在你的应用程序的显示部分。此外,还有许多您可能会忽略、没有意识到或努力避免的极端情况:在会触发闪现消息的页面上提交表单可能会将闪现消息添加到 POST(这,如果干净地完成会触发重定向到带有 GET 的页面)并且在接下来的 GET 上,本质上是添加两条 Flash 消息。现在您无法在 POST 请求上添加即显消息,但是无效的 POSTED 表单将没有即显消息(因为没有 GET)。这是一个头脑f ***。我真的会反对它。
显示是前端的工作,在services/extensions中添加一些助手。让选民保持他们的单一责任(当然不是添加即时消息)。可能扩展您的基本模板以用作 "pages using the extended base template should display the message",然后在您要显示消息的页面上使用它。
真的,干干净净 ;o)
附录:
Flash 消息通常用于向用户提供对他最近完成的操作 的反馈。例如,用户删除了一个博客post。那么 flash 消息应该显示为 "blog post was deleted"(它可能包含更多信息 ^^)。
sessions flash bag 的实用程序是概念,即 flash 消息将保存在那里,直到它们被检索到。这对于反馈很方便,因为它通常会在下次 实际 呈现页面时呈现。
在很多情况下,否则很难管理。如果您只加载页面的片段(可能 ajax 令人耳目一新的东西),不希望您的 Flash 消息在那里,也不会被删除,该怎么办?如果您 POST 编辑了一个表单并成功重定向到一些完全不相关的页面,该怎么办?该页面是否应该知道用户来自哪里?最好不要(关注点分离)。 Flash 消息不关心(单一责任)。开发人员决定可以在何处显示 Flash 消息(通常在 "full page render" 或如果专门访问)。
它们也不是灵丹妙药。如果您打开了多个浏览器选项卡,它们可能会非常混乱(因为可能会显示从另一个选项卡生成的 flash 消息)。但是,如果您的网页需要浏览器中的多个选项卡,您还会遇到其他一些问题。但是,我觉得偶尔接受"stray flash message"是好的。
如何获得投票给 "granted" 的选民,内部活动订阅者?有没有我可以获取和使用的服务?
我的用例。我的应用程序有两个选民:主要选民和管理员选民。当主要选民不允许访问但管理员选民允许访问时,我想显示额外的闪存消息。 我可以通过两种不同的解决方案解决这个问题:通过在管理员选民内部调度事件或通过在选民内部设置 flash msg——但我想避免它,因为我需要确保只有一个选民投票支持访问。
所以,我将从解决方案开始,以回答您提出的问题。我将以解决(恕我直言)潜在问题作为结尾。
极其简单的解决方案:
将两个选民合并为一个,替换他们两个。如果您的条件得到满足,则设置 flash 消息是该合并选民的责任,但这很简单,因为您拥有两个选民的 "results" ...
稍微多一点eloquent:
创建一个 CombinedVoter,替换两者。 CombinedVoter 将接收两个选民作为依赖项并将投票请求转发给他们并 return / 投射他们的适当组合(因此本质上是一个伪装成选民的 AccessDecisionManager)。当满足您的条件时,选民显然会设置闪现消息。
有点没用:
创建一个 CombinedVoter,不替换任何东西,但仍然接收两个选民作为依赖项,将投票请求转发给他们并在所有情况下 return 弃权。当满足您的条件时,选民显然会设置闪现消息。
有点过度设计:
为两个 Voters 添加一个 EventDispatcher 并发送投票事件。让侦听器侦听这些事件,并在收到第二个事件(脏 af)时触发,或者在满足您的条件时再次触发内核事件以设置 flash 消息。
稍微减少过度设计:
添加一个也是 EventListener 的服务,侦听 相同的内核事件以设置快闪消息,但不侦听投票事件,而是注入为两个选民提供服务,并通过 setAdminVote()
/setMainVote()
或其他方式直接在该服务上设置投票结果。
根本问题:
从语义上讲,您的选民并不意味着关心即显消息和其他选民投票的内容。这既不是他们的目的,也不是他们的责任。将此添加到他们的功能是恕我直言的误导,这是错误的地点和时间! (语义!)
相反,既然这可能是一条特殊消息,为什么不将其添加到您的基本模板中(当然有一些方法可以检查某人是否是管理员但 "main voter" 不允许,例如使用 is_granted
在模板中或直接 app.user.roles
(如果适用)。您还可以编写一个小的 twig 扩展来添加该功能并以某种方式使用两个选民。
为什么我建议将此逻辑放在模板中:因为这是一个显示问题。你想要显示一些东西,所以它应该放在你的应用程序的显示部分。此外,还有许多您可能会忽略、没有意识到或努力避免的极端情况:在会触发闪现消息的页面上提交表单可能会将闪现消息添加到 POST(这,如果干净地完成会触发重定向到带有 GET 的页面)并且在接下来的 GET 上,本质上是添加两条 Flash 消息。现在您无法在 POST 请求上添加即显消息,但是无效的 POSTED 表单将没有即显消息(因为没有 GET)。这是一个头脑f ***。我真的会反对它。
显示是前端的工作,在services/extensions中添加一些助手。让选民保持他们的单一责任(当然不是添加即时消息)。可能扩展您的基本模板以用作 "pages using the extended base template should display the message",然后在您要显示消息的页面上使用它。
真的,干干净净 ;o)
附录:
Flash 消息通常用于向用户提供对他最近完成的操作 的反馈。例如,用户删除了一个博客post。那么 flash 消息应该显示为 "blog post was deleted"(它可能包含更多信息 ^^)。
sessions flash bag 的实用程序是概念,即 flash 消息将保存在那里,直到它们被检索到。这对于反馈很方便,因为它通常会在下次 实际 呈现页面时呈现。
在很多情况下,否则很难管理。如果您只加载页面的片段(可能 ajax 令人耳目一新的东西),不希望您的 Flash 消息在那里,也不会被删除,该怎么办?如果您 POST 编辑了一个表单并成功重定向到一些完全不相关的页面,该怎么办?该页面是否应该知道用户来自哪里?最好不要(关注点分离)。 Flash 消息不关心(单一责任)。开发人员决定可以在何处显示 Flash 消息(通常在 "full page render" 或如果专门访问)。
它们也不是灵丹妙药。如果您打开了多个浏览器选项卡,它们可能会非常混乱(因为可能会显示从另一个选项卡生成的 flash 消息)。但是,如果您的网页需要浏览器中的多个选项卡,您还会遇到其他一些问题。但是,我觉得偶尔接受"stray flash message"是好的。