我正在尝试从5号角客户端到API平台对实体进行PUT请求。
在角度方面,我通过Google地图检索了一个地址。该地址是实体JourneyAddress的属性,因此我使用JourneyAddress模型向API平台发送了一个PUT请求,该地址的地址属性是一组Google地图地址组成部分(street_address,locality等)。
现在,我需要对该属性执行一些操作,然后再将其提交给Doctrine,例如,我需要将google提供的位置与数据库中的位置进行匹配。
我正在考虑一个侦听器,该侦听器将侦听JourneyAddress的prePersist和preUpdate事件,并使用LocalityRepository :: findBy(['name'=>'Paris'])之类的内容查找所需的本地实例,并更新travelAddress实例并将其返回给Doctrine以执行持久/更新操作。
问题在于API平台会检查提交的数据类型是否符合Doctrine的期望。我向API平台发送了一个数组,但Doctrine实际上需要一个字符串。
对于上下文,发送的数组可以是:
src/Doctrine/EventListener/JourneyAddressListener.php:32:
object(App\Entity\JourneyAddress)[2615]
private 'id' => null
private 'title' => string 'dzfkdqsmlfjsldkflm' (length=18)
private 'search' => string 'mlsqjfkldsjfsqdjlmf' (length=19)
private 'address' =>
array (size=8)
'street_number' => string '2650' (length=4)
'route' => string 'Avenida Rivadavia' (length=17)
'sublocality_level_1' => string 'Balvanera' (length=9)
'administrative_area_level_2' => string 'Comuna 3' (length=8)
'administrative_area_level_1' => string 'Buenos Aires' (length=12)
'country' => string 'Argentine' (length=9)
'postal_code' => string 'C1034' (length=5)
'postal_code_suffix' => string 'ACS' (length=3)
private 'latitude' => float 50.6507791
private 'longitude' => float 3.0657951
private 'media' => null
private 'indication' => string 'klqsjflkmqjfkqjfksflmlqfmlks' (length=28)
我需要提取street_address并将其另存为JourneyAddress的address属性,但是Doctrine实体是:
/**
* @ORM\Column(type="string", length=255)
* @Groups("journey")
* @Assert\Type("string")
* @Assert\NotBlank(
* message = "Le champs 'Adresse du point de départ' doit être rempli",
* groups={"departureFormValidation"}
* )
*/
private $address;
有没有一种方法可以在实际的API平台类型检查之前使用我的侦听器?我也尝试做一个自定义操作,但结果是一样的,类型检查总是排在第一位,并阻止进一步的操作。
我当然可以用数组替换地址的类型,然后发送['my string'],但是我不应该这样输入。
答案 0 :(得分:1)
文档侦听器始终在验证后执行。有内置的api平台(Symfony)事件侦听器,它们在验证之前执行:https://api-platform.com/docs/core/events/ <fruit.producer1:Apple>
...
</fruit.producer1:Apple>
<fruit.producer2:Apple>
...
</fruit.producer2:Apple>
似乎是个好地方。
但是,对于同一字段使用混合数据类型(数组,字符串)不是一个好主意,请考虑为数组地址或单独的未映射字段使用单独的模型类。