web-dev-qa-db-de.com

Verwenden Sie Filter und Aktionen für die Plugin-API?

Ich möchte eine öffentliche API in ein von mir entwickeltes Plugin integrieren.

Die übliche Art und Weise, wie andere Plugins APIs integrieren, besteht darin, einige Funktionen zu definieren, die von einem beliebigen Thema oder Plugin aufgerufen werden können.

Ich halte dies jedoch für eine schlechte Idee, da dies zu Fehlern führt, wenn mein API-Plugin nicht aktiv ist und ich auf die Idee gekommen bin, Filter und Aktionen für die API zu verwenden. Ähnlich wie folgt:

// Get some user specific data from my plugin:
$data = false;
if ( apply_filters( 'mp:is-active' ) ) {
    $data = apply_filters( 'mp:get-user-data' );
}

// Add a private notification for a single user:
do_action( 'mp:send-notification', $user_id, $message );

Die Frage ist:

Ich habe diese Art von API noch nie in anderen Plugins gesehen. Gibt es einen guten Grund, sie nicht zu verwenden (z. B. schlechte Leistung usw.)?

Oder denkst du, das ist ein guter Weg?

5
Philipp

Sicher hat dieser Ansatz einige Vorteile, hat aber auch einige Probleme.

Es ist nicht wirklich einfach zu bedienen

Wenn das Ziel Ihres Plugins WordPress-Entwickler sind, sind sie mit der Plugin-API sehr vertraut, aber Endbenutzer nicht.

Für einen Nichtentwickler etwa:

$data = give_me_the_data();

Es ist einfacher zu verstehen, sich zu merken und zu tippen als:

$data = apply_filters( 'give_me_the_data' );

Wenn Sie sich einige der Fragen auf dieser Site ansehen, können Sie verstehen, wie viel Verwirrung es in Bezug auf Aktionen und Filter in WordPress bei Neulingen und Nicht-Entwicklern gibt.

Das "Tippfehler" -Problem

Als eine Person, die viele Tippfehler macht, weiß ich, dass sie frustrierend sind. Wenn Sie eine Funktion mit einem Tippfehler schreiben, wird ein Fehler ausgegeben und der Benutzer erkennt das Problem sofort. Ein Tippfehler in einem Aktionsnamen führt dazu, dass die API fehlschlägt, aber es ist ziemlich schwer zu erkennen.

Zum Beispiel:

$data = apply_filters('mp:get-user-data'); // works

$data = apply_filters('mo:get-user-data'); // does not work, hard to find why

$data = mp_get_user_data(); // works

$data = mo_get_user_data(); // does not work and throws an error, immediately found

Die globale Hölle

Aktionen und Filter sind nur globale Variablen. Wenn Sie sie zum Erstellen Ihrer API verwenden, kann Ihr Code von jeder anderen Codezeile im System verarbeitet werden.

Dies bedeutet, dass ein Fehler in einem beliebigen Wer-weiß-welche-Plugin dazu führen kann, dass Ihr Plugin ohne ersichtlichen Grund ausfällt. Und der Grund ist, dass Ihr Plugin nicht ausfällt.

Beispiel:

do_action( 'mp:send-notification', $user_id, $message );

// somewhere else
add_action( 'all', 'do_something_bad_that_makes_your_plugin_fail');

Darüber hinaus kann jeder diese Hooks verwenden, und selbst wenn dies Ihrer API viel Flexibilität verleiht, bringt dies auch viel Komplexität mit sich.

Wenn Sie beispielsweise Objekte als Argumente verwenden, die als Referenz übergeben werden, werden sie möglicherweise geändert, bevor Ihr Rückruf ausgeführt wird.

Fazit

Dies sind die Gründe, die mir jetzt einfallen, aber vielleicht gibt es andere Gründe, wenn dieser Ansatz nicht weit verbreitet ist.

Für mich würde ich diesen Ansatz nicht verwenden, insbesondere für den letzten Punkt, aber ich kann nicht sagen, dass er im WordPress-Kontext absolut falsch ist.

Daher möchte ich Sie nicht davon abhalten, es zu verwenden, sondern nur vorschlagen, alle Probleme im Voraus zu berücksichtigen, da es sehr schwierig ist, zu wechseln, sobald Sie eine API öffentlich veröffentlichen.

5
gmazzap

Beide Ansätze schließen sich nicht aus. Wie @gmazzap sagte, erstelle keine Rückruf-Hölle.

Sie können jedoch einen ersten Haken setzen, damit sich andere Entwickler nicht auf die eher langsamen function_exists()-Prüfungen verlassen müssen.

Beispiel

Stellen Sie in Ihrem Plugin einen Hook bereit, mit dem andere Entwickler Ihre Klassen und Funktionen sicher aufrufen können.

add_action( 'wp_loaded', [new Your_Plugin_Bootstrap, 'setup' ], 0 );

class Your_Plugin_Bootstrap {

    public function setup() {

        // set up your data and the auto-loader, then:
        do_action( 'your_plugin_loaded' );
    }
}

Jetzt kann ein Entwickler von Drittanbietern diesen Hook verwenden und mit "normalem" PHP fortfahren.

add_action( 'your_plugin_loaded', function() {

    // safely use your plugin's classes here.
});

Wir machen das in MultilingualPress und das Feedback von anderen Entwicklern war bisher sehr gut. Es ist leicht zu verstehen und Sie müssen nur einen Haken lernen.

Siehe auch: Wie erstelle ich eine API für mein Plugin?

6
fuxia