sdsdev / rest-bundle-doctrine
Symfony 扩展包,让您轻松通过 REST 暴露 Doctrine 实体
Requires
- php: ^8.1
- doctrine/orm: ^3.1
- jms/metadata: ^2.6
- symfony/expression-language: 7.1.*
- symfony/finder: 7.1.*
- symfony/framework-bundle: 7.1.*
- symfony/property-access: 7.1.*
- symfony/security-bundle: 7.1.*
- symfony/serializer: 7.1.*
- symfony/validator: 7.1.*
- symfony/yaml: 7.1.*
Requires (Dev)
- brianium/paratest: ^6.10
- doctrine/doctrine-bundle: ^2.5
- doctrine/doctrine-fixtures-bundle: ^3.0
- liip/test-fixtures-bundle: ^2.2
- phpunit/phpunit: ^9.5.11
- symfony/browser-kit: 7.1.*
- symfony/dom-crawler: 7.1.*
- symfony/phpunit-bridge: 7.1.*
- symfony/uid: 7.1.*
README
感谢 Philip Washington Sorst 为从以下项目 fork 初始版本所做的贡献 Project。
更新项目以支持 Doctrine ORM 3 和 Symfony 7.1.*
关于
此 Symfony 扩展包会自动为所有注册的 Doctrine ORM 实体生成路由。
它生成 get、search、update、insert 和 delete 路由。
安装
通过 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 身份验证,因此只有登录后才能访问。
用法
完全安装后,应可访问 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: 1
,perPage: 50
)。要控制分页,您可以在请求体中传递page
和perPage
。
{ "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状态码