guhemama / http-precondition-bundle
在使用 Symfony HttpKernel 组件时引入路由预条件。
2.0.0
2023-11-16 13:45 UTC
Requires
- php: ^8.2
- symfony/config: ^6.0|^7.0
- symfony/dependency-injection: ^6.0|^7.0
- symfony/expression-language: ^6.0|^7.0
- symfony/http-kernel: ^6.0|^7.0
Requires (Dev)
- doctrine/coding-standard: ^11.0
- phpstan/phpstan: ^1.10
- phpstan/phpstan-symfony: ^1.2
- phpunit/phpunit: ^10.0
- squizlabs/php_codesniffer: *
README
HTTP 预条件包
此包引入了一个 Precondition
属性,可用于在路由时检查特定条件。当条件不满足时,将抛出异常(412 预先条件失败
)。
安装
使用 Composer 安装包
$ composer require guhemama/http-precondition-bundle
用法
要定义新的预条件,导入 Guhemama\HttpPreconditionBundle\Annotations\Precondition
属性,并提供一个要评估的表达式 expr
- 接受任何有效的 ExpressionLanguage 表达式。
<?php namespace App\Controller; use Guhemama\HttpPreconditionBundle\Annotations\Precondition; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\Routing\Annotation\Route; class QuestionController extends AbstractController { #[Precondition(expr: "1+1 > 2")] #[Route('/question')] public function index(): JsonResponse { return $this->json(['answer' => 42]); } }
当使用 ParamConverter
(Symfony 5)或 MapEntity
(Symfony 6+)属性时,您也可以在预条件表达式中引用映射的实体
<?php use App\Entity\Question; use Guhemama\HttpPreconditionBundle\Annotations\Precondition; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Bridge\Doctrine\Attribute\MapEntity; class QuestionController extends AbstractController { #[Precondition(expr: '!question.isAnswered()', message: 'Cannot answer an already answered question.', payload: ['error' => 'QUESTION_ALREADY_ANSWERED'])] #[Route(path: '/question/{id}', methods: ['POST'])] public function update( #[MapEntity(Question::class)] Question $question ): Response { return new JsonResponse($question); } }
当预条件表达式评估为假时,将抛出 \Guhemama\HttpPreconditionBundle\Exception\Http\PreconditionFailedHttpException
异常。此异常还包括一个 Precondition
实例,如果您需要访问其配置的值(例如 payload
)。
配置
此包依赖于 ExpressionLanguage 组件。如果您扩展了表达式语言或希望使用另一个实例而不是默认实例,请按照以下方式更新配置,将 my_custom_expression_lang_service
替换为您服务的名称
# config/packages/guhemama_http_precondition.yaml guhemama_http_precondition: expression_language: my_custom_expression_lang_service