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

New Resource with default ownership of current user

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

这是否可以通过设置实现,或者我是否需要覆盖控制器中的每个操作?

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

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

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

编辑:请查看@Łukasz 的回答,其中包含更简洁的备选解决方案。 ;)

Paweł 推荐的是事件,我也是第一个,但 Łukasz 推荐的是一些重写工厂和存储库。

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

此评论的唯一目的是讨论这两种解决方案。

总结一下:

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

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

如果这是您想要的,您最终会得到两个被覆盖的资源(自定义工厂和存储库),并且在定义路由时您需要在 yaml 中处理其余部分。无需更改控制器。

两种方法的一些比较:

  1. 用侦听器解决它可能会更快(只需要 class)和更容易。
  2. 通过事件侦听器管理它不需要任何路由更改。
  3. 重写工厂将确保该对象始终由给定用户创建。事件在创建后调度,但在将其保存到数据库之前。
  4. 自定义存储库方法将确保非所有者甚至无法显示编辑页面。

两者都是正确的。恕我直言,第一个更快,第二个更干净。决定你需要什么