在实体持久化之前对其执行操作
Perform operation on an entity before its persistence
我正在尝试对实体执行 PUT 请求,从 angular 5 客户端到 API 平台。
在 angular 方面,我通过 Google 地图检索地址。该地址是实体 JourneyAddress 的 属性,因此我使用我的 JourneyAddress 模型向 API 平台发送 PUT 请求,地址 属性 是 google 的数组地图地址组件(street_address、地点等)。
现在我需要在将它提交给 Doctrine 之前对此 属性 执行一些操作,即我需要将 google 给出的位置与我们数据库中的位置匹配。
我正在考虑一个侦听器,它会侦听 JourneyAddress prePersist 和 preUpdate 事件,找到我需要的地点实例,例如 LocalityRepository::findBy(['name' => 'Paris'] ), 更新 journeyAddress 实例并将其返回给 Doctrine 以执行 persist/update 操作。
问题是 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 的地址 属性,但是 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'],但我喂它不应该那样。
Doctrine 侦听器总是在验证后执行。有内置的 api-platform (Symfony) 事件侦听器在验证之前执行:https://api-platform.com/docs/core/events/ PRE_VALIDATE
似乎是个好地方。
但是,对于同一字段使用混合数据类型(数组、字符串)并不是一个好主意,请考虑为您的数组地址或单独的未映射字段使用单独的模型class。
我正在尝试对实体执行 PUT 请求,从 angular 5 客户端到 API 平台。
在 angular 方面,我通过 Google 地图检索地址。该地址是实体 JourneyAddress 的 属性,因此我使用我的 JourneyAddress 模型向 API 平台发送 PUT 请求,地址 属性 是 google 的数组地图地址组件(street_address、地点等)。
现在我需要在将它提交给 Doctrine 之前对此 属性 执行一些操作,即我需要将 google 给出的位置与我们数据库中的位置匹配。
我正在考虑一个侦听器,它会侦听 JourneyAddress prePersist 和 preUpdate 事件,找到我需要的地点实例,例如 LocalityRepository::findBy(['name' => 'Paris'] ), 更新 journeyAddress 实例并将其返回给 Doctrine 以执行 persist/update 操作。
问题是 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 的地址 属性,但是 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'],但我喂它不应该那样。
Doctrine 侦听器总是在验证后执行。有内置的 api-platform (Symfony) 事件侦听器在验证之前执行:https://api-platform.com/docs/core/events/ PRE_VALIDATE
似乎是个好地方。
但是,对于同一字段使用混合数据类型(数组、字符串)并不是一个好主意,请考虑为您的数组地址或单独的未映射字段使用单独的模型class。