sdsdev/rest-bundle-doctrine

Symfony 扩展包,让您轻松通过 REST 暴露 Doctrine 实体

0.3.7 2024-08-14 07:25 UTC

This package is auto-updated.

Last update: 2024-09-19 09:10:18 UTC


README

感谢 Philip Washington Sorst 为从以下项目 fork 初始版本所做的贡献 Project

更新项目以支持 Doctrine ORM 3 和 Symfony 7.1.*

关于

此 Symfony 扩展包会自动为所有注册的 Doctrine ORM 实体生成路由。

它生成 getsearchupdateinsertdelete 路由。

安装

通过 composer 安装

composer require sdsdev/rest-bundle-doctrine

在您的 Symfony 项目的 config/bundles.php 文件中启用 Bundle

return [
    ...
    SdsDev\RestBundleDoctrine\DdrRestBundle::class => ['all' => true]
];

在您的 Symfony 项目的 config/routes.xml 文件中注册路由

<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="https://symfony.com.cn/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://symfony.com.cn/schema/routing
https://symfony.com.cn/schema/routing/routing-1.0.xsd">
...
    <import resource="." type="rest_json"/>
</routes>

身份验证

要启用所有端点的默认 Symfony #[CurrentUser] 身份验证,请执行以下步骤

  • config/ 中创建名为 doctrineRest 的新文件夹
  • config/doctrineRest 中创建一个名为 doctrine_rest_auth.yaml 的新 yaml 文件
  • 将以下内容添加到 config/doctrineRest/doctrine_rest_auth.yaml
auth:
  true

这将使所有端点启用基本的 Symfony 身份验证,因此只有登录后才能访问。

Symfony 安全文档

用法

完全安装后,应可访问 Doctrine ORM 中注册的所有实体的路由。

路由将以 JSON 格式返回或接收数据。

要查看所有路由的列表,请使用以下命令

bin/console debug:router

实体名称是您的实体的名称,全部小写,所以 UserRole 将是 userrole

搜索

    /api/doctrine/search/{entityName}

方法: POST

请求选项

Body 架构

{
    "associations":[
        "...",
        "..."
    ],
    "filter":[
        {
            "type": "equals",
            "field": "id",
            "value": 1
        }
    ],
    "sort":[
        {
            "field": "id",
            "order": "ASC"
        }
    ],
    "page": 2
}

关联

您可以自由添加关联,这些关联将与请求的实体一起加载。

关联需要以 snake case 的形式给出,并且是一个字符串。

关联可以深入 2 层。

示例

用户有一个关联的表 UserRole,我们想要加载它。

我们的 Body 将如下所示

{
    "associations":[
        "user_role"
    ]
}
嵌套关联

对于 嵌套关联,您可以使用 entity.entity 连接它们。

例如,如果 UserRole 有一个关联的表 permissions,我们还想加载它们

我们的 Body 将如下所示

{
    "associations":[
        "user_role.permissions"
    ]
}

过滤器

可用过滤器

  • equals
  • not_equals
  • gt(大于)
  • lt(小于)

要获取 id 为 1 的用户,我们的 Body 将如下所示

我们的 Body 将如下所示

{
    "filter":[
        {
            "type": "equals",
            "field": "id",
            "value": 1
        }
    ],
}

如果我们想要根据特定的角色过滤用户,我们也可以这样做

{
    "filter":[
        {
            "type": "equals",
            "field": "userRole.id",
            "value": 1
        }
    ],
}

这将返回所有具有 id 为 1 的 UserRole 的用户。

如果我们想同时加载和过滤关联,我们可以给过滤器一个 mode 参数。

截至编写本文档时,仅支持 "mode": "full",其他一切都不会产生影响。

所以,如果我们想获取具有 UserRole id 1 和相应 UserRole 的用户,我们的 Body 将如下所示

{
    "associations":[
        "user_role"
    ],
    "filter":[
        {
            "type": "equals",
            "field": "userRole.id",
            "value": 1,
            "mode": "full"
        }
    ],
}

如果我们想获取所有 UserRole,但仍然只获取 UserRole.id 为 1 的用户,我们只需删除 "mode":"full" 参数。

排序

我们可以通过在请求体中提供一个sort数组来定义实体的排序。

示例请求体

{
    "sort":[
        {
            "field": "id",
            "order": "ASC"
        }
    ]
}

可用的排序方式

  • 升序(ASC)
  • 降序(DESC)

分页

分页默认启用(page: 1perPage: 50)。要控制分页,您可以在请求体中传递pageperPage

{
    "page": 1,
    "perPage": 20
}

获取

    /api/doctrine/get/{entityName}/{id}

方法:GET

返回具有给定名称和ID的实体。

获取也可以使用关联,请参阅上面的关联

插入

    /api/doctrine/insert/{entityName}

方法: POST

请求体是您想要创建的对象的JSON表示。

假设您有一个用户实体User,User有id、name、username、additionalName、一个国家(多对一实体),并且我们有一个id为1的国家。

要插入新用户,您的请求体将如下所示

{
    "id": 1,
    "name": "Test User",
    "username": "TestAccount",
    "additionalName": null,
    "country": 1
}

(如果id是自增的,您必须在json中删除"id"字段)

如果未设置必填的外键,API将返回错误!

如果成功,返回201状态码

更新

    /api/doctrine/update/{entityName}/{id}

方法:PUT/PATCH

假设您有一个用户实体User,User有id、name、username,并且您想要更新username

您的更新请求体将如下所示

{
    "username": "New User Name"
}

如果成功,返回200状态码

删除

    /api/doctrine/delete/{entityName}/{id}

方法:DELETE

删除具有给定ID的实体。

如果ID不存在,将返回错误。

如果成功,返回204状态码