Есть ли хороший способ для проверки объектов, тип которых является производным от класса EntityDrupalWrapper?

38

Я уверен, что этот вопрос относится к другим сложным типам объектов, но EntityDrupalWrapperэто тот, с которым я сейчас работаю. Это тип объекта, возвращаемого entity_metadata_wrapper()(и, возможно, другими).

При использовании кода, как показано ниже:

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

вывод от Devel не слишком полезен:

Скриншот

Он не показывает то, что вы ожидаете увидеть для вызова dpm(), например, с stdClassобъектом.

Подобный вызов to dvm()печатает объект, но я не знаком с ним, и он не очень читабелен.

Я пытался, debug()и он выдает уведомление пользователя PHP, которое выглядит примерно так:

скриншот 2

Кстати, вывод HTML, содержащийся в этом предупреждении, является тем же выводом, что выводится dvm()на экран.

Как я могу проверить эти типы объектов (желательно с помощью Krumo), чтобы увидеть, какие свойства доступны? Или я застрял с помощью dvm()?

Клайв
источник
попробуйте debug (), представленный в Drupal 7
Shoaib Nawaz
Спасибо @ShuaibNawaz, еще меньше успехов с этим, хотя я боюсь (я обновил вопрос)
Клайв
2
Да, это точно одна из проблем с классами-обертками. dpm () / krumo видит только общедоступные свойства. Все в классах-оболочках защищено, и доступ осуществляется через магические методы __get () и __set ().
Бердир
@Berdir Я боялся этого; Я не смотрел, но пахло очень похоже __get()и __set()были вовлечены. Из интереса у вас есть какой-нибудь предпочтительный способ узнать, какие свойства класса доступны для какой оболочки? Или это просто «знание», основанное на опыте?
Клайв
1
@Berdir Я не думаю, что вы получите уведомление об этом, вы можете использовать dpm($wrapper->getPropertyInfo());, это действительно помогает
Клайв

Ответы:

38

Используйте dpm ($ wrapper-> getPropertyInfo ());

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

TwiiK
источник
А для проверки определенных полей вашего узла вы можете использовать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');

РЕДАКТИРОВАТЬ:

Если вы создали свою обертку без передачи второго параметра,
то есть entity_metadata_wrapper ('commerce_order');
затем методы set и value будут генерировать исключения, поскольку они не реализованы.

Шоаиб Наваз
источник
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())

Это хорошо работает для меня.

Ник
источник
0

Используйте Drupal Cli

$ drupal debug:entity
// Displays current events 
Кевин Хаубрук
источник