有没有一种好的方法来检查其类型是从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()打印到屏幕上的输出相同。

如何检查这些类型的对象(最好使用Krumo),以便查看可用的属性?还是我坚持使用dvm()


尝试在Drupal 7中引入debug()
Shoaib Nawaz 2012年

谢谢@ShuaibNawaz,尽管担心它(我已经更新了问题),但在那个人身上取得的成功却更少了
Clive

2
是的,这正是包装器类的问题之一。dpm()/ krumo仅看到公共属性。包装类中的所有内容均受保护,并可以通过魔术__get()和__set()方法进行访问。
Berdir 2012年

@Berdir我很害怕;我没看,但闻起来很像__get()__set()并参与其中。出于兴趣,您有什么首选的方法来找出哪些包装类可用的类属性吗?还是仅仅是基于经验的“了解”问题?
克莱夫(Clive)

1
@Berdir我认为您不会收到通知,可以使用dpm($wrapper->getPropertyInfo());,它确实可以帮助您
Clive

Answers:


38

使用dpm($ wrapper-> getPropertyInfo());

docs中


要检查节点中的特定字段,您可以使用kpr($wrapper->my_custom_field->value());
wranvaud

4

我一直在玩EntityDrupalWrapper对象。debug()通常返回__toString()准备的输出。

我使用foreach迭代了EntityDrupalWrapper对象,它有助于列出属性的名称。

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

检查模块提供你要调试的数据的一个很好的结构示意图。

获取具有指导性且格式正确的变量转储,深度堆栈跟踪以及执行时间配置文件-数据库日志(报告/最近的日志消息),文件或屏幕。


3

如果要检查为包装器“供电”的原始对象,请尝试:

dpm($wrapper->raw())

这对我来说很好。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.