guhemama/http-precondition-bundle

在使用 Symfony HttpKernel 组件时引入路由预条件。

安装次数: 1,620

依赖项: 0

建议者: 0

安全: 0

星标: 3

关注者: 2

分支: 0

公开问题: 2

类型:symfony-bundle

2.0.0 2023-11-16 13:45 UTC

This package is auto-updated.

Last update: 2024-09-16 15:31:50 UTC


README

Packagist Version Packagist Downloads

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