Überschreiben von include_* Methoden in Serializern

Hallo @david,

Nur eine kurze Frage zum Hintergrund dieser Veralterung

Veralterungshinweis: add_to_serializer sollte nicht verwendet werden, um include_*?-Methoden direkt zu überschreiben

Kontext: DEV: Improve add_to_serializer include_* options (#21220) · discourse/discourse@26b7f8a · GitHub

Ich verstehe den Wunsch, die Leute zur Verwendung des Arguments include_condition in einer Standardverwendung der Methode add_to_serializer zu bewegen, d. h. um eigene Methoden zu Serializern hinzuzufügen.

Es gibt jedoch einige Fälle, in denen ein Plugin eine include_-Methode zu einem Serializer hinzufügen möchte, die nicht diesem Fall entspricht, d. h. wenn Sie nicht bestimmen, ob Ihr eigenes benutzerdefiniertes Attribut enthalten ist, sondern eine include_-Methode in einem Core-Serialisierer überschreiben, z. B.

Kernmethode: discourse/app/serializers/site_serializer.rb at main · discourse/discourse · GitHub

Ich schätze, dass dieser spezielle Anwendungsfall überdacht werden könnte, um keine Überschreibung der Site-Serialisierermethode zu erfordern, oder dass die Überschreibung auf andere Weise erreicht werden könnte, aber ich frage mich, ob es einen inhärenten Nachteil gibt, die Verwendung der Methode add_to_serializer auf diese Weise zuzulassen, und ob die Veralterung zu einer Entfernung der Verwendung der Methode auf diese Weise führen wird.

4 „Gefällt mir“

Ja, das wäre meine Empfehlung.

Wir haben kürzlich ein neues System für ‘Plugin-Modifikatoren’ eingeführt, die sehr günstige Erweiterungspunkte sind, die DiscourseEvent ähneln, aber einen Eingabewert annehmen und einen Wert zurückgeben. In Ihrem Fall könnten Sie einen Core-PR erstellen, um einen DiscoursePluginRegistry.apply_modifier-Aufruf in der entsprechenden include_-Methode hinzuzufügen, und dann können Sie register_modifier in Ihrem Plugin verwenden, um den Wert zu überschreiben.

Es ist wahrscheinlich, dass wir es schließlich vollständig blockieren werden, ja. Außerdem möchten Sie wirklich keine Methode verwenden, die Deprecation-Hinweise in den Protokollen ausgibt.

Wenn Sie unbedingt eine Methode ohne Kooperation von Core überschreiben müssen, dann scheint modify_class die bessere Wahl zu sein. Der Hauptgrund, warum wir ein dediziertes add_to_serializer haben, ist, dass es automatisch eine include_*-Methode definiert, sodass sie nur angewendet wird, wenn das Plugin aktiviert ist.

Das bedeutet, dass der von Ihnen verlinkte Code-Snippet derzeit zwei Methoden definiert. include_wizard_required? und include_include_wizard_required? :sweat_smile:

11 „Gefällt mir“

In der Readme steht, dass sie “als Stack (First-in, First-out) funktioniert”, aber das ist eine Warteschlange. Ein Stack ist First-in, Last-out. (Ich kann nicht einmal herausfinden, wie ich den Text auf meinem Handy kopieren kann).

4 „Gefällt mir“

guter Fang. Ja, Stack ist LIFO und Queue ist FIFO

Hauptmerkmale dieser Modifikatoren:

  • Funktionieren in einem Stack (zuerst registriert, zuerst aufgerufen)
  • Werden automatisch deaktiviert, wenn das Plugin deaktiviert wird
  • Übergeben das kumulative Ergebnis aller Blockaufrufe an den Aufrufer
1 „Gefällt mir“

Es ist eher ein „Middleware-Stack“: eine Reihe von Methoden, die nacheinander ausgeführt werden und deren Ergebnis jeweils an die Eingabe der nächsten Methode weitergegeben wird.

Ich glaube nicht, dass der Versuch, LIFO/FIFO-Terminologie hier anzuwenden, funktionieren wird: Es wird nichts zum „Stack“ hinzugefügt/entfernt – es gibt kein „Out“.

4 „Gefällt mir“

Oh. Also keine Stack-Datenstruktur.

Ich fing an, etwas darüber zu sagen, wie ich 1987 meinen CS-Abschluss gemacht habe und nicht wusste, was die Leute heute lernen. :joy:

2 „Gefällt mir“

Das ist irgendwie mein Problem. Ich habe eine Lücke von fast 10 Jahren, in der ich kaum noch einen Computer benutzt habe (nach über 25 Jahren Arbeit damit), und es fühlt sich an, als ob ein riesiger Wissensbereich fehlt.

3 „Gefällt mir“

Dieses Thema wurde 30 Tage nach der letzten Antwort automatisch geschlossen. Neue Antworten sind nicht mehr möglich.