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

时间:2018-09-19 20:54:23

标签: symfony api-platform.com

我正在尝试从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'],但是我不应该这样输入。

1 个答案:

答案 0 :(得分:1)

文档侦听器始终在验证后执行。有内置的api平台(Symfony)事件侦听器,它们在验证之前执行:https://api-platform.com/docs/core/events/ <fruit.producer1:Apple> ... </fruit.producer1:Apple> <fruit.producer2:Apple> ... </fruit.producer2:Apple> 似乎是个好地方。

但是,对于同一字段使用混合数据类型(数组,字符串)不是一个好主意,请考虑为数组地址或单独的未映射字段使用单独的模型类。