hirschen / rest
dev-master
2020-10-30 11:34 UTC
Requires
- php: ^7.1.0
- ext-json: *
- friendsofsymfony/rest-bundle: ^2.5
- friendsofsymfony/user-bundle: ~2.1
- gesdinet/jwt-refresh-token-bundle: 0.8.1
- incenteev/composer-parameter-handler: ^2.1
- jms/serializer-bundle: ^2.4
- lexik/jwt-authentication-bundle: ^2.4
- sensio/framework-extra-bundle: ^5.4
- symfony/console: 4.3.*
- symfony/dotenv: 4.3.*
- symfony/flex: ^1.3.1
- symfony/monolog-bundle: ^3.1.0
- symfony/polyfill-apcu: ^1.0
This package is not auto-updated.
Last update: 2024-09-24 16:07:59 UTC
README
此软件包提供认证(JWT)、序列化、验证、参数转换等功能。此外,还定义了几个常量、辅助类和服务,以支持构建标准化的Rest API。异常通过监听器捕获并序列化为JSON响应。
配置Symfony Bundle
https://symfony.com.cn/doc/current/bundles/best_practices.html
了解更多关于Symfony的朋友
FOS User
https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/index.rst
FOS REST
https://symfony.com.cn/doc/current/bundles/FOSRestBundle/index.html
了解更多关于Lexik (JWT Management)
https://github.com/markitosgv/JWTRefreshTokenBundle
安装
composer require hirschen/rest
将bundle添加到bundles.php
<?php
return [
...
Hirschen\Rest\HirschenRestBundle::class => ['all' => true],
...
];
创建私钥和公钥,并在.env中引用它们
###> lexik/jwt-authentication-bundle ###
JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem
JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
JWT_PASSPHRASE=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
将刷新路由添加到routes.yml
gesdinet_jwt_refresh_token:
path: /api/auth/refresh
controller: gesdinet.jwtrefreshtoken::refresh
将Hirschen/Rest序列化服务添加到services.yml
Hirschen\Rest\Service\ParamConverter\SerializerService:
autowire: false
public: true
arguments:
- "@fos_rest.serializer"
- "@fos_rest.validator"
- "validationErrors"
- "@doctrine_mongodb.odm.document_manager"
- '@Hirschen\Rest\Service\User\UserService'
在config/packages
在gesdinet_jwt_refresh_token.yaml
gesdinet_jwt_refresh_token:
user_provider: fos_user.user_provider.username_email
object_manager: doctrine_mongodb.odm.document_manager
ttl_update: true
manager_type: mongodb
在lexik_jwt_authentication.yaml(链接环境变量)
lexik_jwt_authentication:
secret_key: '%env(resolve:JWT_SECRET_KEY)%' # required for token creation
public_key: '%env(resolve:JWT_PUBLIC_KEY)%' # required for token verification
pass_phrase: '%env(resolve:JWT_PASSPHRASE)%' # required for token creation, usage of an environment variable is recommended
token_ttl: 5184000 # 60 days
user_identity_field: email
在security.yaml
- 添加编码器和提供者
- 为需要受保护的路线添加守卫
- 添加登录路由
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
...
...
api:
pattern: ^/api
stateless: true
provider: fos_userbundle
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
...
...
login:
pattern: ^/api/login
stateless: true
anonymous: true
logout: true
provider: fos_userbundle
form_login:
check_path: /api/login
success_handler: user.authentication_success_handler
failure_handler: lexik_jwt_authentication.handler.authentication_failure
require_previous_session: false
username_parameter: email
password_parameter: password
在fos_rest.yaml中添加异常控制器
# Read the documentation: https://symfony.com.cn/doc/master/bundles/FOSRestBundle/index.html
fos_rest:
body_listener: true
body_converter:
enabled: true
validate: true
validation_errors_argument: validationErrors
format_listener:
rules:
- { path: '^/', priorities: ['json'], fallback_format: json, prefer_extension: false }
param_fetcher_listener: true
exception:
enabled: true
exception_controller: 'Hirschen\Rest\Controller\ExceptionController::showAction'
view:
view_response_listener: 'force'
formats:
json: true
验证的序列化和参数转换
摘要(如何工作)
- JSON请求序列化为PHP对象
- 对象被验证 https://symfony.com.cn/doc/current/validation.html#constraint-configuration
- 如果对象是文档(ODM)并且已设置主键(通常为id),则进行到4,否则跳到5。
- 从数据库获取现有文档并与其给定输入同步。将获取的(更新后的)文档传递到5。
- 将对象添加到控制器操作的参数中
以下注解触发了上述功能
use Hirschen\Rest\Annotation\Parameter;
...
class UserController extends BaseController
{
/**
* @Rest\Post("/create", name="admin_user_create")
* @Parameter("user", {"Group 1","Group 2"})
*/
public function x(User $user...): Response
...
Parameter注解的第一个参数是必需的,以便将其映射到控制器函数的参数。在这种情况下,“user”映射到$user。第二个参数是字符串数组,包含必要的组,以确定此软件包执行的序列化和验证的范围。通过在控制器操作中对参数进行类型提示,序列化器识别对象类型。
当控制器操作开始时,JSON已经被序列化和验证($user)。如果$user是新的文档,则它已准备好持久化。如果是现有文档,则已获取、更新并将旧文档设置为$user。
通过使用组标记对象或文档的属性,Parameter注解可以确定序列化和自定义验证的正确范围。
/**
* @Assert\NotBlank(groups={"Group 2", "Group 3"})
* @Groups({"Group 1","Group 2", "Group 3","Group 4" })
* @Serializer\Type("string")
*/
protected $attribute;