如何在 Api-Platform 中按链接属性过滤结果?

2024-05-09

我有一个User实体和一个Organisation实体,存在关系ManyToOne之间Booking and User:

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="bookings")
 * @ORM\JoinColumn(nullable=false)
 */
private $user;

The User实体有一个称为国家的属性。我想将预订设置为仅显示与登录用户位于同一国家/地区的用户所做的记录。这就是我尝试过的

collectionOperations={
*          "get"={
*              "access_control"="object.getUser().getOrganisation() == user.organisation"
*              "normalization_context"={
*                  "groups"={"read"}
*              }
*          },

当然这是行不通的。

我知道我可以过滤查询字符串中传递的参数,但我需要在 API 端而不是客户端过滤这些结果。


On the 文档的安全页面 https://api-platform.com/docs/core/security/#filtering-collection-according-to-the-current-user-permissions says:

根据当前用户的角色或权限过滤集合必须直接在数据提供者级别完成。例如,当使用 Doctrine ORM、MongoDB 和 ElasticSearch 的内置适配器时,应使用扩展来从集合中删除条目。

看着扩展 https://api-platform.com/docs/core/extensions/,你需要做类似的事情:

final class BookingOwnerExtension implements QueryCollectionExtensionInterface
{
    private $security;

    public function __construct(Security $security)
    {
        $this->security = $security;
    }

public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
    {
        if (Booking::class !== $resourceClass || $this->security->isGranted('ROLE_ADMIN') || null === $user = $this->security->getUser()) {
            return;
        }

        $organization = $user->getOrganization()

        $rootAlias = $queryBuilder->getRootAliases()[0];
        $queryBuilder
            ->leftJoin(sprintf('%s.user', $rootAlias), 'u')
            ->andWhere('user.organization = :organization')
            ->setParameter('organization', $organization);
    }
}

(确切的查询取决于您打算做什么,因为我不熟悉您的应用程序,所以我只能为您指出正确的方向。但这只是使用查询生成器向查询添加适当的条件)。

这很可能就足够了,尽管如果您不使用自动配置,则必须使用适当的标签注册自定义扩展:

# api/config/services.yaml
services:
    # ...

    'App\Doctrine\BookingOwnerExtension':
        tags:
            - { name: api_platform.doctrine.orm.query_extension.collection }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Api-Platform 中按链接属性过滤结果? 的相关文章

随机推荐

  • 将 Google 地图 v3 中的标记放在所有其他标记的前面

    有人可以帮我把当前位置放在所有其他位置的前面吗 我已阅读有关 MAX ZINDEX 和 setZindex 的内容 但我无法理解它 这是我的代码 var latlng new google maps LatLng lat lng var i
  • RxJS - 从可观察对象中获取最后 n 个元素

    我想从可观察对象中获取最后 3 个元素 假设我的时间线是这样的 a b c d e f g h i j gt where a b c d e f g h i j are emitted values 每当发出新值时 我想立即获取它 因此它可
  • 如何在 Spring Boot 中创建 Apache POI Excel 视图配置

    当我想使用 Spring Boot Web 将数据导出到 Excel 时遇到问题 我使用 Thymeleaf 作为模板引擎 由 Spring Boot 自动配置 但是当我在附加配置中添加 XmlViewResolver 时 由 XmlVie
  • 使用 test() 通过正则表达式进行信用卡验证

    我正在尝试完成一些作业 看来这本书可能做错了 我有一个简单的 html 页面 允许用户在我们的例子中选择信用卡 美国运通卡 然后 用户输入一个数字并根据正则表达式评估该数字 我的问题最终是当 test 计算它返回的数字时是布尔值还是字符串
  • 静态链接共享对象?或者损坏的文件?

    我有一个从专有来源获得的库 我正在尝试链接它 但出现以下错误 libxxx so 文件无法识别 文件格式无法识别 Collect2 ld 返回 1 退出状态 确实 ldd libxxx so statically linked 这究竟意味着
  • 如何在启动 Rails 控制台时自动运行代码?

    假设每次 Rails 控制台出现时我都想要一个问候语 Scotts MBP 4 ucode scott rails c Loading development environment Rails 4 2 1 Hello there I m
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • Flask SQLAlchemy 与 MyPy - 模型类型错误

    我遇到了以下组合问题flask sqlalchemy and mypy 当我定义一个新的 ORM 对象时 例如 class Foo db Model pass where db是使用创建的数据库SQL炼金术应用于flask app mypy
  • 在 .pyx 文件中导入非整数常量

    如何声明常量 各种类型 不仅仅是枚举值 并在多个之间共享它们 pyx files 在一个 pyx文件中 我可以声明和使用常量 DEF FavouriteFood spam DEF ArraySize 42 print FavouriteFo
  • Spring Security OAuth2 JWT 中的 JWE

    是否可以将 JSON Web 加密 JWE 与 Spring Security OAuth2 JWT 一起使用 现在我有一个追随者JwtAccessTokenConverter Bean public JwtAccessTokenConve
  • 使用 groovy DOMBuilder 省略空属性

    格罗维的标记生成器 http groovy codehaus org api groovy xml MarkupBuilder html has an omitNullAttributes and an omitEmptyAttribute
  • 迁移到 Hibernate 5.x

    我正在将我的应用程序从 Hibernate 3 迁移到 Hibernate 5 我们正在使用DatabaseMetadata类获得TableMetadata 因此使用TableMetadata对象获取数据库表列信息 如列大小 类型等 似乎在
  • python中打印字符串的长度

    有没有什么方法可以找到 即使是最好的猜测 Python中字符串的 打印 长度 例如 potaa bto 是 8 个字符len但 tty 上只打印 6 个字符宽 预期用途 s potato x1b 01 32mpotato x1b 0 0mp
  • gnome-terminal 新选项卡,使用别名作为要执行的命令

    我已经创建了一个别名 bashrc文件如下 alias myproject cd Desktop myproject 当我重新启动终端时保存文件后 输入myproject带我到项目目录 但是当我尝试使用别名作为新的命令参数时gnome te
  • 使用表达式动态决定打开哪个子报表

    我有一份报告 其中包含几页带有图表 表格等的内容 该报告由总是希望对报告进行小修改的不同客户使用 目前 如果客户想要对第 5 页进行更改 则会通过修改重新创建整个报告 即使唯一的更改是在第 5 页的图表中 更重要的是 一些客户不想看到第 3
  • JSP 作为电子邮件模板

    有没有办法发送 MIME 电子邮件 其中电子邮件正文源自 JSP 我需要使用 Javamail 发送一封电子邮件 其中包含一个表格 我认为如果我可以使用 JSP 来完成所有格式设置和布局 将会很方便 在这个线程中 Java 电子邮件模板的建
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • PHP 中 while (true){ 是什么意思?

    我看过这段代码 但不知道这意味着什么 while true echo Hello world 我知道什么是 while 循环 但是 while true 是什么意思 会执行多少次 这不是无限循环吗 虽然是无限循环 但您可以使用以下命令退出它
  • 在 Clojurescript 中查找不匹配的分隔符

    有时我会发现自己遇到大括号 圆括号或方括号不匹配的情况 在 Clojurescript 中 我在用leininingen and cljsbuild我很难追踪到错误源 通常它可以归结为这样 Compiling resources publi
  • 如何在 Api-Platform 中按链接属性过滤结果?

    我有一个User实体和一个Organisation实体 存在关系ManyToOne之间Booking and User ORM ManyToOne targetEntity App Entity User inversedBy bookin