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
/**
* @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
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错误感到满意