Каждый проект рано или поздно требует добавлять кастомные атрибуты. Например, в заказе понадобилось хранить дополнительную дату. Первое что нужно сделать - открыть
документацию. В ней сказано что расширять модели возможно с помощью custom и extension attributes. Как правило, custom используются больше как атрибуты для пользователя, а extension - как системные. Создаем файл extension_attributes.xml и добавляем в него нужные атрибуты к сущностям. В нашем случае дату к модели заказа.
Итак, по документации мы все сделали и теперь можно начать пользоваться атрибутами... но они не работают. Ах да, нужно же очистить кэш. Тогда очищаем и обязательно удаляем сгенерированный код из /generated. Вроде ничего не забыли. Что же, теперь система не ругается на несуществующие атрибуты, но мы опять замечаем что опять ничего не работает.
По прошествии пары дней (у кого как), становится ясно что для обеспечения работы наших дорогих атрибутов оказывается нужно делать специальную реализацию. И опять же, самое интересное - впереди. Сделав реализацию для Repository, для чтения и записи отдельно, - а как вы думали? - внезапно оказывается что в коллекциях атрибуты... правильно, === null. Не, ну а кто любит чтобы сразу и удобно. Очевидно что не разработчики мадженты. Ничего не остается как сделать реализацию и для collection. И не забыть еще плагин afterGetExtensionAttributes. Он будет делать проверку: если атрибуты === null, то создаем их. Не спрашивайте зачем это.
После многих усилий... нет, нет и еще раз нет: ничего не будет работать если вы попробуете загрузить сущность через load в модели. Сказать что система переусложнена - ничего не сказать. Знаете, какие советы по поводу такого на SO? Предлагают загружать сущность [заказ] еще раз. Отлично, после стольких оптимизаций разработчикам приходится загружать сущности на каждом углу ради атрибутов.
При работе с атрибутами хотелось бы добавить свои методы в сущность, но это нельзя сделать. Нет, методы добавить-то можно, но атрибуты могут быть не загружены что убивает всю возможность. Кто-то создает свои модели, наследованные от сущности и отдельно использует их, будучи уверенным что все данные загружены.
Наверное, я не знаю чего-то и где-то допустил ошибки. Я просто хочу понять как начать использовать extension attributes без боли, как правильно с ними работать. Расскажите, пожалуйста, кто понял как.