Кастомная стратегия геренации ID в Doctrine 2

Иногда встроенных в стратегий не достаточно и нужно создать свою. Но делать просто функцию или метод не правильно с точки зрения архитектуры, тогда как у есть встроенные стредства для этого.

 

Решение для версии 2.3.0 +

 

Начиная с версии 2.3.0 в Doctrine появилась стратегия CUSTOM и ее использование достаточно тривиально. Для начала можно заглянуть в файл Doctrine/ORM/Mapping/ClassMetadataInfo.php, чтобы увидеть список доступных стратегий, обозначенный константами.

Виден весь перечень стратегий, ну а нужный CUSTOM используется так. Добавляется следующая аннотация:

Указанный в аннотации класс должен наследоваться от Doctrine\ORM\\AbstractIdGenerator

Все достаточно просто.

 

Решение для версии до 2.3.0

 

До версии 2.3 в Doctrine не существовало встроенной возможности использовать CUSTOM стратегию со своим генератором. Поэтому приходилось расширять класс ClassMetadataInfo.php для добавления свох констант стратегий. Если посмотреть на ClassMetadataInfo.php до версии 2.3 то видно, что нет UUID и CUSTOM.

На примере UUID свою стратегию можно реализовать так. В классе ClassMetadataInfo (или в своем классе наследующемся от него, в этом случае надо еще переопределить один из Doctrine service) добавить константу:

Далее перейти в метод completeIdGeneratorMapping в этом же классе и добавить case случай:

Путь к классу может быть в другом пространстве имен. Теперь стратегию можно использовать.

 

В завершение еще один не такой красивый, но рабочий способ, это использовать систему эвентов, а именно эвент prePersist.