@springimport

Как работать с extension attributes в m2?

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

После многих усилий... нет, нет и еще раз нет: ничего не будет работать если вы попробуете загрузить сущность через load в модели. Сказать что система переусложнена - ничего не сказать. Знаете, какие советы по поводу такого на SO? Предлагают загружать сущность [заказ] еще раз. Отлично, после стольких оптимизаций разработчикам приходится загружать сущности на каждом углу ради атрибутов.

При работе с атрибутами хотелось бы добавить свои методы в сущность, но это нельзя сделать. Нет, методы добавить-то можно, но атрибуты могут быть не загружены что убивает всю возможность. Кто-то создает свои модели, наследованные от сущности и отдельно использует их, будучи уверенным что все данные загружены.

Наверное, я не знаю чего-то и где-то допустил ошибки. Я просто хочу понять как начать использовать extension attributes без боли, как правильно с ними работать. Расскажите, пожалуйста, кто понял как.
  • Вопрос задан
  • 581 просмотр
Пригласить эксперта
Ответы на вопрос 1
@CodeKeeper
Symfony/Magento developer
Для начала нужно понимать что такое EAV сущности и как они работают.
https://alanstorm.com/magento_advanced_orm_entity_...

Extesndion Attribute не что иное как eav атрибут для сущности и работать с ним можно так же как и с любым другим Eav атрибутом.

Сделав реализацию для Repository, для чтения и записи отдельно, - а как вы думали?


Что еще за отдельная реализация?

внезапно оказывается что в коллекциях атрибуты... правильно, === null. Не, ну а кто любит чтобы сразу и удобно.

Нет, методы добавить-то можно, но атрибуты могут быть не загружены что убивает всю возможность


Правильно это как раз и сделано для оптимизации, потому что при работе с большой коллекцией не нужно загружать всю информацию. Для этого существует addAttributeToSelect который добавляет информацию атрибута в результирующую выборку.

Предлагают загружать сущность [заказ] еще раз. Отлично, после стольких оптимизаций разработчикам приходится загружать сущности на каждом углу ради атрибутов.


Потому что они не знают про то как работает EAV и про addAttributeToSelect

$collection->addAttributeToSelect('unit_of_sale', 'catalog_product_entity_varchar')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы