Wie vermeide ich die Bearbeitung von Drupal Core?

21

Ich habe einen Austausch mit einem Partner-XML-Service aufgebaut und konnte das XML nicht richtig darstellen, aber wie bei allen Drupal-Dingen ist die xmlrpc-Fehler- und Aktionsprotokollierung weniger als robust.

Also habe ich das in includes / xmlrpc.inc gemacht.

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

Ich bekam die Daten, die ich brauchte, und in 10 Minuten reagierte die Partner-Oberfläche angemessen auf meine Anfrage, weil (schockierend, ich weiß) Protokolle gut sind.

Ich mag die zusätzliche Protokollierung, und ich möchte es behalten. Was ist die saubere, unkomplizierte und vor allem von Drupal genehmigte Vorgehensweise?

OhkaBaka
quelle
2
Ich verstehe nicht, warum dies abgelehnt wurde. Ja, der Bearbeitungskern wird nicht empfohlen, aber @OhkaBaka räumt ein, dass dies Vorschläge zur Verwaltung dieses Problems erfordert, und lieferte ein Beispiel aus der Praxis. Neben der Notwendigkeit, Situationen zu debuggen, gibt es legitime Gründe für die Bearbeitung des Kerns. Es gibt einige Fehler in Core-Patches mit funktionierenden Patches in der Problemwarteschlange, die einfach nicht angewendet werden, und es gibt einige Dinge, die keine wirklichen Problemumgehungen bieten.
mpdonadio
1
Die Antworten unten sind großartig. Eine Sache, die ich jedoch hinzufügen möchte, ist, dass Sie die Protokollierung nicht die ganze Zeit auf Ihrer Live-Site aktivieren müssen. Deaktivieren Sie Ihr benutzerdefiniertes Modul, wenn Sie es nicht verwenden, oder wenden Sie Ihren Patch oder Ihr Modul nur auf Ihre Entwickler-Site an. Wenn Sie Änderungen minimieren und sorgfältig dokumentieren, bleiben Sie gesund.
greg_1_anderson
@ greg_1_anderson - Sie werden feststellen, dass meine unten stehende Lösung dies bereits durch die Verwendung einer log_level-Variablen anspricht (obwohl die Verwendung von Konstanten offensichtlich sauberer wäre, habe ich sie weggelassen, um das Muster hervorzuheben). Auf diese Weise können Sie dieselbe Wrapper-Methode für dev / live verwenden, und der Rest Ihres Codes kann davon abhängen, ohne die Funktionsaufrufe zu ändern. Sie müssen lediglich die Protokollierungsstufe Ihres Moduls mithilfe variable_set()eines ähnlichen Mechanismus festlegen, der bei Bedarf exportiert werden kann. :]
David Watson
1
@ David: Ja, das ist großartig. Ich mag es, Dev-Module inaktiv zu halten und sie in einem Post-SQL-Sync-Hook zu aktivieren (per drupalcode.org/project/drush.git/blob/HEAD:/examples/…). Ihre Technik erhält ebenfalls Bestnoten, obwohl ich denke, ich würde auch die Variable_set in einem Drush-Post-Sync-Hook anstatt einer Funktion tun. Das Anwenden eines Patches nur auf das Dev-System, wie ich oben sagte, ist wahrscheinlich eine schlechte Idee, es sei denn, Sie sind sicher, dass das System wirklich ein Scratch-System ist. Andernfalls könnte das Spiel versehentlich ausgeführt und verschoben werden. Autsch.
greg_1_anderson
@ greg_1_anderson - Eigentlich wollte ich untersuchen, ob es solche Hooks gibt, und wusste nicht, dass es bereits Beispiele gibt. vielen dank für den link! Da ich jetzt weiß, dass dies möglich ist, stimme ich zu, dass das Festlegen dieser Einstellung auf der Umgebungsebene definitiv der richtige Weg ist, sowohl aus den von Ihnen vorgeschlagenen Gründen als auch um die allgemeine Standortkonfiguration von der umgebungsspezifischen Konfiguration zu entkoppeln.
David Watson

Antworten:

11

Von Hacking Core wird Uneingeweihten dringend abgeraten, da es die Support-Community von Tausenden effektiv auf eine Support-Community von einer reduziert (oder was auch immer Ihre Teamgröße ist). Ohne diese bewährte Methode wäre es nahezu unmöglich, Drupal-Neulingen zu helfen. Dies beeinträchtigt auch die Modularität und in einigen Fällen die Sicherheit.

Nachdem dies gesagt wurde, ist Hacking Core nicht immer so böse, wie wir es gerne ausmachen. Ohne eine Änderung des Kerns hätten wir keine Distributionen wie Pressflow und dergleichen, die den Kern auf interessante Weise erweitern. Es ist nur von entscheidender Bedeutung, dass Sie genau wissen, was Sie tun, dass Sie Ihre Patches mit Ihrer Distribution verteilen (vorzugsweise so, dass Sie sie nach dem Upgrade automatisch erneut anwenden können) und dass Sie eine detaillierte Dokumentation führen von dem, was du geändert hast und warum du es geändert hast.

Abhängig davon, wie Sie die Dinge strukturiert haben, können Sie die oben genannten Änderungen vornehmen xmlrpc_request(), einen Patch erstellen und dann Drush Make verwenden, um das Anwenden zu automatisieren (beachten Sie, dass Drush Make für die 5.x-Version in das Drush-Projekt selbst verschoben wird ), während Sie im Makefile und an anderer Stelle zusätzliche Dokumentationen darüber bereitstellen, was die Änderung bewirkt und warum sie notwendig / erwünscht ist.

Ein weiteres gängiges Muster zur Verbesserung der Kernfunktionen besteht darin, einen Wrapper zu erstellen, der einer Kernfunktion ein kleines Stück Funktionalität hinzufügt, und den Wrapper anstelle der Implementierung des Kerns aufzurufen. Dies macht die Dinge viel modularer, wenn dies machbar ist. Folgendes berücksichtigen:

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

Wiederum, je nachdem, was Sie tun, ist dies möglicherweise machbar oder nicht machbar, aber wenn dies der Fall ist, haben Sie sich ein paar Kopfschmerzen erspart, um sicherzustellen, dass der Kern gepatcht und dokumentiert bleibt. In diesem Fall scheint eine einmalige Funktion wie diese ein perfekter Kandidat für einen solchen Wrapper zu sein. Wenn Ihre Implementierung in einem Modul erfasst ist, können Sie es sogar erweitern, um die Protokollstufe Ihrer gesamten Lösung zu steuern, und diese Funktion an Produktionsstandorten deaktivieren:

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

Kurz gesagt, Sie möchten maximieren, was Sie mit Modulen tun können (und Sie können viel tun), aber es gibt berechtigte Gründe für die Änderung des Kerns. Es sollte mit Sorgfalt gemacht werden, das ist alles.

David Watson
quelle
9

Wenn Sie Kern- oder Contrib- Module ändern müssen, sollten Sie dies tun .

  1. Erstellen Sie einen Patch mit Änderungen.
  2. Verwenden Sie ein Bereitstellungssystem wie drush make, mit dem Patches automatisch erneut angewendet werden, wenn Sie den Kern oder die Module aktualisieren.
  3. Dokument Dokument Dokument.
googletorp
quelle
1
Ich hatte wirklich nicht damit gerechnet, dass sich der Kern durch irgendeine Art von Vorstellungskraft ändern würde. Deshalb bin ich jetzt gezwungen, zu einer zweiten Frage überzugehen: Ist dies in irgendeiner Weise besser, als dasselbe in einem eigenständigen Modul zu tun?
OhkaBaka