在实体持久化之前对其执行操作

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。