__toString лучше не использовать. Приводя объект к строке при помощи (string), мы можем забыть обработать null и получим на выходе '' вместо null. То есть еще один потенциальный способ выстрелить в ногу 🦵🔫.Подробнее с примерами: https://github.com/ShittySoft/symfony-live-berlin-2018-doctrine-tutorial/pull/3#issuecomment-460441229.
На радостях заменил в проекте все приведения на
$vo->toString(), убрал <ImplicitToStringCast errorLevel="suppress"/> в psalm.xml и удалил все методы __toString. Ну и конечно же функциональные тесты красные 🔴. Потому что Doctrine не умеет в ValueObject идентификаторы 😡. Конкретно на этой строке https://github.com/doctrine/orm/blob/2.7/lib/Doctrine/ORM/UnitOfWork.php#L1521 выполняется неявное приведение к строке 🤯.Почирикал с @ocramius (https://twitter.com/vudaltsov/status/1201511202205163520). Он сказал, что приведение идентификаторов к примитивам через
Type::convertToDatabaseValue хорошая идея, но может значительно сказаться на производительности.В итоге пришлось вернуть
__toString() {Entity}Id классам.Выводы:
- Psalm & ImplicitToStringCast — 👍🔥,
-
__toString — 👎 (но будьте внимательны в местах взаимодействия с инфраструктурой),- функциональные тесты — 😘🎉.