如何避免编辑Drupal核心?


21

我当时正在与合作伙伴XML服务建立交换,但我无法正确处理XML,但是与所有Drupal一样,xmlrpc错误和操作日志都不可靠。

所以我在include / xmlrpc.inc中做到了这一点。

function xmlrpc_request($method, $args) {
  $xmlrpc_request = new stdClass();
  $xmlrpc_request->method = $method;
  $xmlrpc_request->args = $args;
  $xmlrpc_request->xml = <<<EOD
<?xml version="1.0"?>
<methodCall>
<methodName>{$xmlrpc_request->method}</methodName>
<params>
EOD;
  foreach ($xmlrpc_request->args as $arg) {
    $xmlrpc_request->xml .= '<param><value>';
    $v = xmlrpc_value($arg);
    $xmlrpc_request->xml .= xmlrpc_value_get_xml($v);
    $xmlrpc_request->xml .= "</value></param>\n";
  }
  $xmlrpc_request->xml .= '</params></methodCall>';

  /* This part here */
  watchdog('xmlrpc',$xmlrpc_request->xml);
  /* End ridiculously tiny hack */

  return $xmlrpc_request;
}

我得到了我需要的数据,并在10分钟内使合作伙伴界面正确响应了我的请求,因为(令人震惊的)日志很好。

我喜欢额外的日志记录,并且希望保留它。什么是干净,直接,最重要的是Drupal批准的方式?


2
我不明白为什么这被否决了。是的,不建议使用编辑核心,但@OhkaBaka承认这是在寻求有关如何管理此问题的建议,并提供了一个实际示例。除了调试情况之外,还有合理的理由来编辑内核。问题队列中的核心w /工作补丁中有一些bug不会被应用,并且有些事情实际上没有解决方法。
mpdonadio

1
下面的答案很好。不过,我要补充的一件事是,您不需要一直在实时站点上打开日志记录。在不使用自定义模块时将其禁用,或者仅将补丁或模块应用于您的开发站点。最小化更改并仔细记录文档将使您保持理智。
greg_1_anderson

@ greg_1_anderson-您会发现我下面的解决方案已经通过使用log_level变量解决了这一问题(尽管使用常量显然会更干净,但我省略了它们,以强调模式)。这样,您可以在dev / live上使用相同的wrapper方法,而其余代码可以依赖于它,而无需更改函数调用。您所需variable_set()要做的就是使用或类似的机制(如果需要可以导出)来设置模块的日志记录级别。:]
David Watson

1
@David:是的,太棒了。我喜欢保持开发模块处于禁用状态,并在每个drupalcode.org/project/drush.git/blob/HEAD:/examples/中的post-sql-sync挂钩中启用它们 ,尽管我也获得了最高分。我想我也会在匆忙的后同步钩子而不是功能中执行variable_set。如前所述,仅在开发系统上应用补丁可能不是一个好主意,除非您确定该系统确实是一个临时系统。否则,比赛可能会被意外执行并被推送。哎哟。
greg_1_anderson 2012年

@ greg_1_anderson-我实际上是要研究是否存在这样的钩子,但没有意识到已经有示例了;非常感谢您的链接!现在知道这是可能的,我同意在环境级别设置此方法绝对是可行的方法,这既出于您建议的原因,又有助于使通用站点配置与特定于环境的配置脱钩。
大卫·沃森

Answers:


11

对于初学者,强烈建议不要使用Hacking Core,因为它可以有效地将成千上万的支持社区减少为一个(或无论您的团队规模如何)支持社区。没有这种最佳实践,帮助Drupal的新手几乎是不可能的。它还会妨碍模块化,在某些情况下还会影响安全性。

话虽如此,黑客核心并不总是像我们想像的那样邪恶。如果不修改核心,我们将不会有像Pressflow之类的发行版以有趣的方式增强核心。至关重要的是,您必须确切地知道自己在做什么,要随发行版一起分发补丁程序(最好是一种允许您在升级后自动应用补丁程序的方式),并且要保留详细的文档您所做的更改以及更改原因。

根据结构的不同,您当然可以对进行上述更改xmlrpc_request(),创建一个补丁,然后使用类似Drush Make的方法来自动应用它(请注意,Drush Make即将进入5.x版本的Drush项目本身。 ),同时在makefile和其他地方提供其他文档,说明所做的更改以及更改的必要性/原因。

增强核心功能的另一种常见模式是创建一个包装器,该包装器向核心功能添加一点点功能,然后调用包装器来代替核心​​的实现。在可行的情况下,这会使事情更具模块化。考虑以下:

/**
 * Wrapper function for xmlrpc_request() to provide logging.
 */
function mymodule_xmlrpc_request($method, $args) {
  $xrr = xmlrpc_request($method, $args);
  watchdog('xmlrpc', $xrr->xml);
  return $xrr;
}

再次,这取决于您正在执行的操作,可能可行或不可行,但是当您这样做时,您在确保确保对内核进行修补和记录方面为自己省了一些麻烦。尽管在这种情况下,像这样的一次性函数似乎是此类包装程序的理想选择。如果您的实现是在模块中捕获的,则您甚至可以对其进行扩展以控制整个解决方案的日志级别,从而在生产站点上禁用此功能:

/**
 * Wrapper function for xmlrpc_request() to provide logging (if enabled).
 */
function mymodule_xmlrpc_request($method, $args) {
  $xrr = xmlrpc_request($method, $args);
  if (variable_get('mymodule_log_level', 0) > 0) {
    watchdog('xmlrpc', $xrr->xml);
  }
}

简而言之,您想最大限度地利用模块(并且可以做很多事情)进行操作,但是出于合理的原因,更改内核。应该小心,仅此而已。


9

如果您需要更改核心贡献模块,则应该。

  1. 创建具有更改的补丁。
  2. 使用诸如drush make之类的部署系统,该系统将在您更新核心或模块时自动重新应用补丁。
  3. 文档文档文档。

1
我真的不期望通过任何想象力来验证改变核心的行为……因此,我现在不得不转向第二个问题:这在任何方面都比在独立模块中做同样的事情更好吗?
OhkaBaka 2012年
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.