2amigos / storage-service
Slim 3 存储API微服务
Requires
- php: ^7.2
- ext-http: *
- ext-json: ^1.6
- ext-pdo: *
- crell/api-problem: ^2.0
- doctrine/dbal: ^2.6
- enqueue/enqueue-bundle: ^0.9.7
- enqueue/fs: ^0.9.2
- gettext/gettext: ^4.6
- gofabian/negotiation-middleware: ^0.1.2
- guzzlehttp/guzzle: ^6.3
- league/flysystem: ^1.0
- league/fractal: ^0.13.0
- league/tactician: ^1.0
- lstrojny/functional-php: ^1.6
- micheh/psr7-cache: ^0.5.0
- monolog/monolog: ^1.17
- pagerfanta/pagerfanta: ^2.0
- ramsey/uuid: ^3.8
- robmorgan/phinx: ^0.10.6
- slim/slim: ^3.9
- symfony/console: ^4.2
- symfony/dotenv: ^4.2
- symfony/framework-bundle: ^4.2
- symfony/yaml: ^4.2
- tuupola/base62: ^1.0
- tuupola/cors-middleware: ^0.8.0
- tuupola/slim-basic-auth: ^3.2
- tuupola/slim-jwt-auth: ^3.1
- zendframework/zend-inputfilter: ^2.8
- zendframework/zend-paginator: ^2.8
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.10@dev
- fzaninotto/faker: ^1.8
- overtrue/phplint: ^1.0
- phpstan/phpstan: ^0.11.2
- phpunit/phpunit: ^7.3
- roave/security-advisories: dev-master
- squizlabs/php_codesniffer: ^3.2
This package is auto-updated.
Last update: 2024-09-22 09:13:32 UTC
README
存储服务是一个微服务,使用league/flysystem文件系统抽象来存储文件。
它被构建以允许我们在2amigos的开发团队中避免在涉及微服务基础设施的项目上重复配置存储适配器。它是两个独立应用的组合,一个是Symfony的CI应用,另一个是使用Slim3构建的API。
项目使用Monolog进行日志记录,Fractal作为序列化工具,Tactitian作为命令总线,基本访问认证和Json Web Tokens(这是可选的)进行认证,Zend filter进行数据过滤和验证,以及Phinx进行数据库迁移。
包含Docker compose和Postman collection文件,以便于开发,尽管开发时不需要严格使用docker,因为可以使用内置的PHP服务器。
此项目试图遵循DDD原则。
安装
使用composer安装最新版本。
$ composer create-project --no-interaction --stability=dev 2amigos/storage-service app
如果您正在使用私有仓库(以下以github url为例)。
$ composer create-project --no-interaction --stability=dev 2amigos/storage-service app --repository-url=https://github.com/2amigos/storage-service
配置
项目使用环境文件来配置机密信息。因此,您必须在项目的根目录下创建一个名为.env
的文件。已提供包含所有必需环境值的.env.example
文件。修改该文件并将其保存为根目录下的.env
。
默认情况下,API应用配置为在基本认证过程中运行。它使用用户数组来完成此目的,但您可以很容易地通过配置[HttpBasicAuthentication middleware(https://github.com/tuupola/slim-basic-auth/blob/3.x/src/HttpBasicAuthentication.php#L43)来改变这种行为,创建自己的或使用库中提供的。请参阅PdoAuthenticator。
如果认证成功,操作将返回一个Json Web Token,用于后续调用。
认证或使用作用域是可选的。如果您不希望使用这种类型的设置,只需删除HttpBasicAuthentication
、JwtAuthentication
和ScopeMiddleware
中间件的中间件配置即可。
用法
使用您在.env
文件中使用的凭据创建一个数据库。现在,您可以使用以下命令运行Phinx
数据库迁移
./vendor/bin/phinx migrate -e development
为了本例,请转到应用的public
文件夹并像这样启动内置的PHP服务器
php -S localhost:8080
现在我们可以访问API,地址为:http://127.0.0.1:8080
。
获取令牌
要获取令牌,请使用以下操作
$ curl "https://127.0.0.1:8080/token" \ --request POST \ --include \ --insecure \ --header "Content-Type: application/json" \ --data '["mail.all"]' \ --user test:test HTTP/1.1 201 Created Content-Type: application/json { "data": { "token": "XXXXXXXXXX", "expires": 1550271641 } }
存储文档
同步
使用token
,您现在可以发送一个application/form-data
格式的请求来存储文档。
$ curl -X POST \ https://127.0.0.1:8080/document/store \ -H 'Authorization: Bearer YOUR_TOKEN_HERE' \ -H 'Cache-Control: no-cache' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Postman-Token: 22bf2715-35e4-41ee-a04b-fd8beddcdd62' \ -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \ -F name=nameofthedocument \ -F async=false \ -F 'document=@/path/to/document/to/attach/41835188_10217308479844850_6484466208170049536_o.jpg'
上述命令将在默认配置在runtime
文件夹中的spool目录下创建一个电子邮件消息。
异步
将文档发送到队列
Enqueue是默认的队列服务,并配置为使用runtime/queue
目录。
curl -X POST \ https://127.0.0.1:8080/document/store \ -H 'Authorization: Bearer YOUR_TOKEN_HERE' \ -H 'Cache-Control: no-cache' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Postman-Token: 22bf2715-35e4-41ee-a04b-fd8beddcdd62' \ -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \ -F name=nameofthedocument \ -F async=true \ -F 'document=@/path/to/document/to/attach/41835188_10217308479844850_6484466208170049536_o.jpg'
上述命令将在默认配置在runtime
文件夹中的spool目录下创建一个电子邮件消息。
从队列中获取文档并存储
我们使用Enqueue Filesystem Transport来简化从队列存储文档的任务,因为它包含一些实用的命令。
php-enqueue/enqueue-bundle提供了一组实用的命令。有关这些命令的完整参考,请访问其文档。
用于消费队列中所有文档的是enqueue:consume
命令:./bin/console enqueue:consume storage --no-interaction -vvv --receive-timeout=60000
端点响应将包含文档的uuid,您可以在其他调用中使用它。
{
"data": {
"success": true,
"status": 3,
"uuid": "136b4cdf-736e-488a-a427-b1d1114f376d"
}
}
分页
对于分页,您可以使用Pagerfanta或Cursor。您可以选择其中之一,这取决于您在dependencies.php
中的配置 - $container['paginator'] = $container['paginator.pagerfanta'];
如果您想了解更多关于Fractal分页的信息,请在这里查看Fractal Pagination
示例
Pagerfanta
https://127.0.0.1:8080/documents/list?filter=limit(3|1):order(created_at|desc)
响应中将看到类似的内容
"meta": {
"pagination": {
"total": 17,
"count": 3,
"per_page": 3,
"current_page": 2,
"total_pages": 6,
"links": {
"previous": "https://127.0.0.1:8080/documents/list?filter=limit(3|1):order(created_at|desc)",
"next": "https://127.0.0.1:8080/documents/list?filter=limit(3|3):order(created_at|desc)"
}
}
}
请注意,您还有下一页和上一页的链接可以使用。
Cursor
https://127.0.0.1:8080/documents/list?cursor=limit(3|2)
其中3
是限制数,2
是作为游标使用的起始ID。您将得到类似的内容
"meta": {
"cursor": {
"current": "2",
"prev": null,
"next": "4",
"count": 3
}
}
测试
对于测试,我们使用PHPUnit
设置
为了设置您的测试环境,需要几个步骤
- 创建
.env.test
文件。您可以使用.env.example
并根据需要修改其值来创建测试文件。APP_ENV
的值应为test
- 创建一个测试数据库并使用
env.test
文件中的值。 - 运行迁移以填充测试数据库
./vendor/bin/phinx migrate -e testing
- 在
./phinx.php
中将使用的env文件更改为.env.test
运行测试
首先您需要运行您的本地测试服务器。转到public/test/
目录并使用此命令:php -S localhost:8081
如果没有错误,您应该会看到测试服务器正在端口8081
上监听 - Listening on http://localhost:8081
最后,使用此命令运行测试:./vendor/bin/phpunit --testdox tests --bootstrap tests/autoload.php
贡献
要贡献,请阅读我们的贡献指南。
致谢
- Tuupola slim api skeleton 感谢您提供样板代码的灵感!
- 2amigos
- 所有贡献者
许可证
BSD许可证(BSD)。请参阅许可文件获取更多信息。
软件之外
www.2amigos.us