Drupal,entity_metadata_wrappers 和调试
Drupal, entity_metadata_wrappers and debugging
为了在 Drupal 中处理实体,我使用了实体元数据包装器("Drupal way")。
开始编码并了解它的所有优点真的很容易...除非您遇到致命错误并且您不清楚它的来源。
这是数据库日志显示的内容:
EntityMetadataWrapperException: Unknown data property
field_whatever. at EntityStructureWrapper->getPropertyInfo()
(line 335 of
/var/www/html/sites/all/modules/entity/includes/entity.wrapper.inc).
可悲的是,很多时候 "field_whatever" 是 "nid"、"uid" 或一些非常常见的 属性,所以它的名字遍布我的代码,这让我很难找到错误的根源。
我目前正在这样做:
- 写一小段代码,然后运行看看是否有问题。
- 在处理具有 "not so common" 个字段的实体时使用 getPropertyInfo。
- 脱发。
最糟糕的是,有时错误并没有在您编码时出现,而是在一周后出现。所以它可以在任何地方...
有什么方法可以更好地处理实体元数据包装器错误?我能否在数据库日志中获得更好的信息而不仅仅是一行?也许是回溯?
谢谢。
好吧,让 devel 模块处于活动状态(只是为了查看漂亮的 krumo 消息)我们可以在我们的模块中做这样的事情:
<?php
set_exception_handler('exception_with_trace');
function exception_with_trace($e)
{
dpm($e->getTrace());
}
这将 return 实体元数据处理程序在下一个页面加载时抛出的异常的回溯错误(您站点中的某些页面,其中一切 运行 都很好)。
您还可以专门为某些页面或某些具有某种角色的用户设置更优雅的异常处理程序...或者当满足 url 中的某些参数时,或者当您处于某种状态时满足 Drupal 站点(例如,当 bool 持久变量 'exception_with_trace' 为真时)。甚至,在一定的条件和控制下,你也可以在生产中使用它。
如果该站点无法运行 "at all" 您可以将其包含在您的 settings.php 文件中,但不是打印跟踪,您必须将跟踪写入文件并在一个文件中观察跟踪不同的上下文(不是 Drupal,而是一些 php 文件)。
如果异常太长并且导致内存问题,那么也可以将跟踪作为字符串获取。参见 http://php.net/manual/es/exception.gettraceasstring.php
希望对您有所帮助。
为了在 Drupal 中处理实体,我使用了实体元数据包装器("Drupal way")。
开始编码并了解它的所有优点真的很容易...除非您遇到致命错误并且您不清楚它的来源。
这是数据库日志显示的内容:
EntityMetadataWrapperException: Unknown data property field_whatever. at EntityStructureWrapper->getPropertyInfo() (line 335 of /var/www/html/sites/all/modules/entity/includes/entity.wrapper.inc).
可悲的是,很多时候 "field_whatever" 是 "nid"、"uid" 或一些非常常见的 属性,所以它的名字遍布我的代码,这让我很难找到错误的根源。
我目前正在这样做:
- 写一小段代码,然后运行看看是否有问题。
- 在处理具有 "not so common" 个字段的实体时使用 getPropertyInfo。
- 脱发。
最糟糕的是,有时错误并没有在您编码时出现,而是在一周后出现。所以它可以在任何地方...
有什么方法可以更好地处理实体元数据包装器错误?我能否在数据库日志中获得更好的信息而不仅仅是一行?也许是回溯?
谢谢。
好吧,让 devel 模块处于活动状态(只是为了查看漂亮的 krumo 消息)我们可以在我们的模块中做这样的事情:
<?php
set_exception_handler('exception_with_trace');
function exception_with_trace($e)
{
dpm($e->getTrace());
}
这将 return 实体元数据处理程序在下一个页面加载时抛出的异常的回溯错误(您站点中的某些页面,其中一切 运行 都很好)。
您还可以专门为某些页面或某些具有某种角色的用户设置更优雅的异常处理程序...或者当满足 url 中的某些参数时,或者当您处于某种状态时满足 Drupal 站点(例如,当 bool 持久变量 'exception_with_trace' 为真时)。甚至,在一定的条件和控制下,你也可以在生产中使用它。
如果该站点无法运行 "at all" 您可以将其包含在您的 settings.php 文件中,但不是打印跟踪,您必须将跟踪写入文件并在一个文件中观察跟踪不同的上下文(不是 Drupal,而是一些 php 文件)。
如果异常太长并且导致内存问题,那么也可以将跟踪作为字符串获取。参见 http://php.net/manual/es/exception.gettraceasstring.php
希望对您有所帮助。