Выполните операцию над объектом до его сохранения - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь выполнить запрос PUT для объекта, от углового 5-го клиента до платформы API.

С другой стороны, я получаю адрес с помощью карт Google.Этот адрес является свойством Entity JourneyAddress, поэтому я отправляю запрос PUT на API Platform с моей моделью JourneyAddress со свойством address, которое представляет собой массив компонентов адреса карты Google (street_address, locality и т. Д.).

Теперь мне нужно выполнить некоторые операции с этим свойством перед отправкой его в Doctrine, т. Е. Мне нужно сопоставить местоположение, указанное Google, с местоположением в нашей базе данных.

Я думал о слушателе, который будет слушатьдля событий JourneyAddress prePersist и preUpdate найдите нужный мне экземпляр местоположения с помощью чего-то вроде LocalityRepository :: findBy (['name' => 'Paris']), обновите экземпляр tripAddress и верните его Doctrine для выполнения операций сохранения / обновления.

Проблема заключается в том, что API Platform проверяет, соответствует ли тип представленных данных тому, что ожидает Doctrine.Я отправил API Platform массив, но 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строка '], но я кормлю это не должно быть так.

1 Ответ

0 голосов
/ 20 сентября 2018

Слушатели Доктрины всегда выполняются после проверки.Есть встроенные слушатели событий api-platform (Symfony), которые выполняются до проверки: https://api -platform.com / docs / core / events / PRE_VALIDATE кажется хорошим местом для этого.

Однако, смешанный тип данных (массив, строка) для одного и того же поля не является хорошей идеей, рассмотрите возможность использования отдельного класса модели для адреса массива или отдельного несопоставленного поля.

...