Возможно, проще всего будет начать с примера.
Кажется, что функция entity_metadata_wrapper() выполняет много сложной магии за кулисами, чтобы вернуть объект со всеми данными, относящимися к рассматриваемому объекту. Но как мне узнать, какие свойства и методы будут доступны мне после возврата объекта?
Допустим, у меня есть коммерческий заказ. (Это не обязательно вопрос о коммерции, это просто хороший пример). При оформлении заказа я хочу проверить, содержит ли заказ позицию данного типа продукта, и уведомить об этом пользователя.Возможно, я также хочу сравнить рассчитанную цену товара в линейке с исходной ценой в типе продукта.
Хорошо, так это Заказ, Позиции), Тип продукта, и Пользователь это все ссылочные объекты. Тип продукта имеет несколько настраиваемых полей, возможно, это ссылки на другой объект, например платежную информацию.
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
Согласно документам Entity API, все эти ссылочные объекты теперь включены в объект, готовый для использования, благодаря оболочке.
Но как мне узнать, как получить доступ к искомому значению или где оно находится в структуре объекта? Являются ли все упомянутые поля drupal своим именем машины по дизайну? Я знаю, что цепочка должна сыграть свою роль, так как это влияет? И не будет ли эта структура меняться каждый раз, когда вызывается entity_metadata_wrapper, учитывая, что рассматриваемый объект может произвольно ссылаться на другие объекты (которые ссылаются на другие объекты и т. д.)? И если структура произвольна, любой код, который полагался на эту структуру в данный момент времени, если она изменится, не нарушит ли это код?
Наконец, я вижу ссылки на такие вещи, как -> сохранить()
и ->значение()
в документах Entity API, но я не могу найти ссылку на полный набор доступных мне методов. Есть ли какая-то логическая структура для выяснения этого или мне нужно каждый раз использовать что-то вроде xdebug (и если я это сделаю, это все равно не даст мне знать, какие методы доступны мне для работы с данными). Это для D7, но если ответ D8+ может добавить ясности, пожалуйста, предоставьте.