Symfony 如何在SQL请求“UUID”之前验证UUID参数;获取项目";API平台中的请求?

Symfony 如何在SQL请求“UUID”之前验证UUID参数;获取项目";API平台中的请求?,symfony,symfony4,api-platform.com,Symfony,Symfony4,Api Platform.com,使用: PostgreSQL 11带有uuid\u generate\u v4类型 Symfony 4.4.11 Api平台2.5.6 我有一个具有以下Id的实体: /** * @ORM\Entity(repositoryClass="App\Repository\ContractRepository") * @ORM\HasLifecycleCallbacks */ class Contract { /** * @ORM\Id() *

使用:

  • PostgreSQL 11带有
    uuid\u generate\u v4
    类型
  • Symfony 4.4.11
  • Api平台2.5.6
我有一个具有以下Id的实体:

/**
 * @ORM\Entity(repositoryClass="App\Repository\ContractRepository")
 * @ORM\HasLifecycleCallbacks
 */
class Contract
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="UUID")
     * @ORM\Column(name="id", type="guid", unique=true)
     */
    private $id;
[...]
我使用Api平台生成以下路由:

App\Entity\Contract:
  itemOperations:
    get:
所以我得到了一个生成的路由,比如
/contracts/{id}

目前,如果我执行
/contracts/TEST
,它将尝试在where子句中使用“TEST”执行SQL请求,因此将作为
500
失败


我想通过断言
{id}
参数是
UUID\u v4
来防止这种行为,如果不是,则返回
400

这种行为特定于DBMS,因此您必须添加自己的逻辑

检索给定ID的实体的API平台组件是

  • 首先,我将声明一个新的异常
    MalformedUIDexception
  • 下一步,我会的
  • 最后,我将创建一个新的ItemDataProviderInterface实现,包装ORM实现并向ID添加一些检查:
  • class ContractDataProvider实现受限的DataProviderInterface、ItemDataProviderInterface
    {
    /**@var ItemDataProviderInterface*/
    私有$realDataProvider;
    公共函数构造(ItemDataProviderInterface$realDataProvider)
    {
    $this->realDataProvider=$realDataProvider;
    }
    公共函数getItem(字符串$resourceClass,$id,字符串$operationName=null,数组$context=[]))
    {
    $uuidPattern='/^[a-f0-9]{8}-([a-f0-9]{4}-{3}[a-f0-9]{12}$/i';
    if(preg_match($uuidPattern,$id)==1){
    返回$this->realDataProvider->getItem($resourceClass,['id'=>$id],$operationName,$context);
    }否则{
    抛出新的MalformedUIDexception(“给定的ID \“$ID\”不是有效的UUID”);
    }
    }
    公共函数支持(字符串$resourceClass,字符串$operationName=null,数组$context=[]):bool
    {
    返回$resourceClass==Contract::class;
    }
    }
    
    #config/services.yaml
    App\DataProvider\ContractDataProvider:
    论据:
    $realDataProvider:'@api_platform.doctrine.orm.default.item_data_provider'
    
    但是,请注意,
    getItem()
    方法的契约没有指定
    MalformedUuidException
    异常,因此此实现违反了Liskov替换原则

    考虑返回null,并对404错误感到满意