Чи є хороший спосіб оглянути об’єкти, тип яких походить від класу EntityDrupalWrapper?


38

Я впевнений, що це питання стосується інших складних типів об'єктів, але EntityDrupalWrapperце той, з ким зараз я працюю. Це тип об’єкта, повернутий entity_metadata_wrapper()(і, ймовірно, іншими).

При використанні коду, як описано нижче:

$order_wrapper = entity_metadata_wrapper('commerce_order', $order_object);
dpm($order_wrapper);

вихід від Devel не надто корисний:

скріншот

Він не показує, що ви очікуєте побачити для дзвінка dpm(), наприклад, з stdClassоб'єктом.

Подібний виклик dvm()дійсно друкує об’єкт, але я не знайомий з ним і він не дуже читабельний.

Я спробував, debug()і це створює повідомлення користувача PHP, яке виглядає приблизно так:

скріншот 2

Між іншим, вихід HTML, який міститься в цьому попередженні, - це той самий вихід, який dvm()друкується на екран.

Як я можу оглянути ці типи об’єктів (бажано, за допомогою Крумо), щоб я міг побачити, які властивості доступні? Або я застряг у використанні dvm()?


спробуйте налагодження (), запроваджене в Drupal 7
Shoaib Nawaz

Дякую @ShuaibNawaz, ще менший успіх з цим, хоча я боюся (я оновив питання)
Клайв

2
Так, це саме одна з проблем із класами обгортки. dpm () / krumo бачить лише загальнодоступні властивості. Все в класах обгортки захищене та доступ за допомогою магічних методів __get () та __set ().
Бердір

@Berdir я цього боявся; Я не дивився, але це дуже пахло, як __get()і __set()були залучені. Не цікаво, чи є у вас кращий спосіб з’ясувати, які властивості класу доступні для якої обгортки? Або це просто питання "знання", заснованого на досвіді?
Клайв

1
@Berdir Я не думаю, що ви отримаєте сповіщення про це, ви можете використовувати dpm($wrapper->getPropertyInfo());, це дійсно допомагає речам
Clive

Відповіді:


38

Використовуйте dpm ($ wrapper-> getPropertyInfo ());

Це в документах .


А для огляду конкретних полів з вашого вузла ви можете скористатисяkpr($wrapper->my_custom_field->value());
wranvaud

4

Я грав з об’єктами EntityDrupalWrapper. debug () зазвичай повертає результат, який, можливо, підготував __toString ()

Я повторив об’єкт EntityDrupalWrapper, використовуючи foreach, і це допомогло перерахувати назву властивостей.

foreach($order_wrapper as $name => $obj){
  debug($name);
  debug(get_class($obj)); //EntityValueWrapper
}

Ось $objоб’єкт типуEntityValueWrapper

$ obj може бути прочитаний $ obj-> value () і може бути записаний $ obj-> set ('value');

Редагувати:

Якщо ви створили свою обгортку, не передаючи другий параметр,
тобто сутність_metadata_wrapper ('commerce_order');
тоді методи встановлення та значення будуть кидати винятки, оскільки вони не реалізовані.


4

Я завершив написання власного маленького віджета для розгортання обгортки:

function _wrapper_debug($w) {
  $values = array();
  foreach ($w->getPropertyInfo() as $key => $val) {
    $values[$key] = $w->$key->value();
  }
  return $values;
}

dpm(_wrapper_debug($some_object_wrapper));

Сподіваюся, хтось вважає це корисним.


3

Модуль Inspect забезпечує хороший структурний вигляд даних, які ви хочете налагоджувати.

Отримайте повчальні і добре відформатовані дампи змінних, глибокі сліди стека та профілі часу виконання - до журналу бази даних (Звіти / Останні повідомлення журналу), до файлу чи на екрані.


3

Якщо ви хочете перевірити оригінальний об'єкт, який "живить" обгортку, спробуйте:

dpm($wrapper->raw())

Це добре працює для мене.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.