具有当前用户的默认所有权的新资源

时间:2016-08-29 22:51:59

标签: symfony sylius

如何使用Resource Bundle添加一些额外的检查以允许我自动将新资源分配给当前用户(还检查他们是否已登录)以及编辑时检查当前用户是否拥有该资源?

这可以通过设置实现还是我需要覆盖控制器中的每个动作?

最初发布在此处 - https://github.com/Sylius/Sylius/issues/5907

3 个答案:

答案 0 :(得分:2)

您可以使用控制器触发的事件。看看这里:http://docs.sylius.org/en/latest/bundles/general/events.html

在监听器中,您应该注入security.context服务,这将允许您检查用户是否已登录。

编辑:请看看@Łukasz的答案,其中包含替代方案,更清洁的解决方案。 ;)

答案 1 :(得分:2)

总结一下:

据我了解你有2例。 首先是创建一个拥有的资源。 最好的方法是装饰一个默认资源工厂,在那里你将注入一些UserContext来确定当前登录的用户。或者只是将它作为第二个参数传递给工厂方法。

第二个是更新资源。您是否只允许向所有者编辑资源?某些存储库方法不仅会接收资源ID,还会接收当前用户的工作。然后,您将拥有一个方法findByIdAndCustomer,因此只允许用户访问编辑页面。否则将显示错误。我想这将是404。

如果这是你想要的,你将得到两个被覆盖的资源(自定义工厂和存储库),你需要在定义路由时处理yaml中的rest。无需更改控制器。

两种方法的比较:

  1. 使用侦听器解析它可能会更快(只需要一个类)并且更容易。
  2. 通过事件侦听器管理它不需要任何路由更改。
  3. 覆盖工厂将确保始终使用给定用户创建此对象。事件在创建后调度,但在将其持久保存到数据库之前。
  4. 自定义存储库方法将确保编辑页面甚至不能由非所有者显示。
  5. 两者都是正确的。恕我直言第一个更快,第二个更清洁。只需决定你需要什么

答案 2 :(得分:0)

Paweł正在推荐活动,我也是第一次,但是Łukasz建议一些工厂和存储库的重要性。

虽然我同意他们两个都是正确的并帮助原始海报实现他的目标,但我想知道他们两个背后的论点是什么。

本评论的唯一目的是对这两种解决方案的争论。