Деньги \ Деньги не могут быть преобразованы в строку - PullRequest
0 голосов
/ 24 мая 2018

Я использую Деньги / Деньги с Symfony и доктриной, но я не уверен, как я должен выполнить отображение.В настоящее время я использую следующее, в результате чего появляется это сообщение об ошибке:

Ошибка:

Money\Money could not be converted to string

Отображение:

/**
 * @Groups({"group1"})
 * @ORM\Column(type="string", nullable=true)
 * @var Money
 */
private $price;

Внутренне Деньги / Деньги используют String как представление, поэтому я подумал, что мог бы использовать и его.

1 Ответ

0 голосов
/ 24 мая 2018

Это происходит из-за преобразования типа доктрины.Перед сохранением doctrine принимает значения ваших свойств и преобразует их в значения SQL, используя type, указанный в аннотации столбца.Так как тип, который вы используете для вашей цены, равен string, доктрина пытается преобразовать ваш объект Money в строку.

У вас есть много способов исправить это, некоторые из них простые, а другие не так уж и много.

  1. Простой, но не оптимальный: Создайте новый класс Money, который будет расширяться оторигинал и создайте метод __toString.Это решит вашу проблему, но свойство, которое вы получите от db, будет строкой, а не объектом.Если вы хотите улучшить это, поместите некоторую настраиваемую логику в ваш установщик, чтобы вы могли создать экземпляр денег из этой стоимости.Простой, но грязный.

  2. Средний комплекс, но может быть не тот, который вам нужен: вам нужно использовать пользовательский тип доктрины .Это действительно не так сложно.Люди боятся этого, но прыгните в документы , и вы увидите, насколько это просто.Он состоит в основном из создания типа, такого как «деньги», который содержит инструкции для доктрины о том, что делать перед сохранением свойств этого типа, и что делать после извлечения значения из базы данных.Таким образом, вы сохраните его как строку в своей базе данных, но вы также будете контролировать выборку, создавая экземпляр Money.Теперь, в зависимости от структуры вашего денежного класса, это может быть не то, что вам нужно.

  3. Вероятно, ваш лучший выбор: я полагаю, что ваш денежный класс не только имеет реальную стоимость, но ивозможно свойство типа валюты.В таком случае, вероятно, Doctrine Embeddable - это ваше лучшее решение.При этом вы сможете разделить фактическое значение и код валюты как отдельные поля в базе данных.Сделайте так, чтобы ваш денежный класс был встраиваемым в Doctrine (поскольку это класс, который живет за пределами вашей доменной логики, в вендоре вам придется использовать yaml или xml, а не аннотации).Когда объект извлекается из БД, это будет экземпляр класса Money.Но чтобы это произошло, вам нужно иметь правильные методы получения и установки, которые может использовать компонент доступа к свойству.Самое лучшее в встраиваемых объектах - это то, что их можно использовать с другими объектами.

Надеюсь, эта информация поможет!Удачного кодирования!

...