Drupalコアの編集を回避するにはどうすればよいですか?


21

私はパートナーのXMLサービスとの交換を構築していましたが、XMLを正しく取得できませんでしたが、Drupalのすべてのものと同様に、xmlrpcエラーとアクションのログは堅牢ではありません。

したがって、includes / 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は、これがこれを管理する方法に関する提案を求めていることを認め、実際の例を提供しました。状況をデバッグする必要性に加えて、コアを編集する正当な理由があります。問題キューの作業パッチのコアにはいくつかのバグがありますが、それらは適用されないだけであり、実際には回避策がないものがいくつかあります。
mpdonadio

1
以下の答えは素晴らしいです。ただし、私が追加することの1つは、ライブサイトで常にログをオンにする必要がないことです。カスタムモジュールを使用していない場合は、カスタムモジュールを無効にするか、パッチまたはモジュールを開発サイトのみに適用します。変更を最小限に抑え、慎重に文書化することで、正気を保つことができます。
greg_1_anderson

@ greg_1_anderson-以下の私の解決策は、log_level変数を使用することで既にこれに対処していることがわかります(定数を使用すると明らかにクリーンになりますが、パターンを強調するためにそれらを省略しました)。このように、dev / liveで同じラッパーメソッドを使用でき、残りのコードは関数呼び出しを変更せずにそれに依存できます。必要なのは、モジュールのログレベルを設定するvariable_set()か、必要に応じてエクスポートできる同様のメカニズムを設定することだけです。:]
デビッドワトソン

1
@デビッド:はい、それは素晴らしいです。私はライブで開発モジュールを無効にしておき、drupalcode.org / project / drush.git / blob / HEAD:/ examples / …に従って post-sql-syncフックでそれらを有効にするの が好きです。また、機能ではなく、drush post-syncフックでvariable_setを実行すると思います。上記で述べたように、システムが本当にスクラッチシステムであることが確実でない限り、開発システムにのみパッチを適用することは、おそらく悪い考えです。そうしないと、誤ってマッチがコミットされてプッシュされる可能性があります。痛い。
greg_1_anderson

@ greg_1_anderson-私は実際にそのようなフックが存在するかどうかを調べることを意味してきましたが、すでに適切な例が存在することを知りませんでした。リンクに感謝します!これが可能であることがわかったので、これを環境レベルで設定することは、あなたが提案する理由と、環境固有の構成から切り離された汎用サイト構成を維持するのに役立つことは間違いありません。
デビッドワトソン

回答:


11

ハッキングコアは、何千ものサポートコミュニティを1つのサポートコミュニティ(またはチームの規模に関係なく)に効果的に削減するため、初心者には強くお勧めしません。このベストプラクティスがなければ、Drupalを初めて使用するユーザーを支援することはほぼ不可能です。また、モジュール性と、場合によってはセキュリティも妨げます。

これは言われているように、ハッキングのコアは、私たちがそうすることを望んでいるほど悪いものではありません。コアを変更しないと、興味深い方法でコアを増強するPressflowなどのディストリビューションはありません。自分が何をしているのかを正確に把握し、ディストリビューションでパッチを配布していること(アップグレード後に自動的に適用できるようにすることが望ましい)、および詳細なドキュメントを保持していることが非常に重要です何を変更したのか、なぜ変更したのか。

構造化方法によっては、上記の変更を確実に行い、xmlrpc_request()パッチを作成してから、Drush Makeなどを使用して適用を自動化することができます(Drush Makeは5.xリリースのDrushプロジェクト自体に移動していることに注意してください) )、メイクファイルやその他の場所で、変更が何をするのか、なぜ/必要なのかに関する追加のドキュメントを提供します。

コア機能を強化する別の一般的なパターンは、コア機能にごくわずかな機能を追加するラッパーを作成し、コアの実装の代わりにラッパーを呼び出すことです。実行可能な場合、これにより物事がよりモジュール化されます。以下を考慮してください。

/**
 * 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;
}

繰り返しになりますが、これは実行可能かどうかによって異なりますが、コアがパッチ適用され文書化されたままであることを確認しようとすると、頭痛の種がいくつかなくなります。ただし、この場合、このような1回限りの関数は、このようなラッパーの完璧な候補のように見えます。実装がモジュールにキャプチャされている場合は、それを拡張してソリューション全体のログレベルを制御し、実稼働サイトでこの機能を無効にすることもできます。

/**
 * 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

コアまたはcontribモジュールを変更する必要がある場合は、そうする必要があります。

  1. 変更を含むパッチを作成します。
  2. コアまたはモジュールを更新するときにパッチを自動的に再適用するdrush makeなどの展開システムを使用します。
  3. ドキュメントドキュメントドキュメント。

1
想像力の広がりによってコアを変更する検証を本当に期待していませんでした...私は今二次的な質問に移動することを余儀なくされています:これはスタンドアロンモジュールで同じことをするよりも優れていますか?
-OhkaBaka
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.