# Remplacement des méthodes include\_\* dans les sérialiseurs

**URL:** https://meta.discourse.org/t/overriding-include-methods-in-serializers/268138
**Category:** Development
**Created:** [Juin 13, 2023, 8:17 UTC](https://meta.discourse.org/t/overriding-include-methods-in-serializers/268138 "2023-06-13T08:17:32Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [Juin 13, 2023, 8:17 UTC](https://meta.discourse.org/t/overriding-include-methods-in-serializers/268138/1 "2023-06-13T08:17:32Z")

</div>

Salut @david,

Juste une petite question sur la réflexion derrière cette dépréciation

> Avis de dépréciation : add\_to\_serializer ne doit pas être utilisé pour remplacer directement les méthodes include\_\*?

Contexte : [DEV: Improve add\_to\_serializer include\_\* options (#21220) · discourse/discourse@26b7f8a · GitHub](https://github.com/discourse/discourse/commit/26b7f8a63bfdb6505b605077a4beb962a9be7b97)

Je comprends le désir de faire passer les gens à l’argument `include_condition` dans une utilisation standard de la méthode `add_to_serializer`, c’est-à-dire pour ajouter leurs propres méthodes aux sérialiseurs.

Cependant, il existe des cas où un plugin peut vouloir ajouter une méthode include\_\* à un sérialiseur qui ne correspond pas à ce cas, c’est-à-dire lorsque vous ne déterminez pas si votre propre attribut personnalisé est inclus, mais que vous remplacez une méthode include\_\* dans un sérialiseur principal, par exemple

> <https://github.com/paviliondev/discourse-custom-wizard/blob/main/plugin.rb#L181>

Méthode principale : [discourse/app/serializers/site\_serializer.rb at main · discourse/discourse · GitHub](https://github.com/discourse/discourse/blob/main/app/serializers/site_serializer.rb#L197)

J’apprécie que cette utilisation particulière puisse être repensée pour ne pas nécessiter de remplacement de la méthode de sérialisation du site, ou que le remplacement puisse être réalisé par d’autres moyens, mais je me demande s’il y a un inconvénient inhérent à permettre une telle utilisation de la méthode `add_to_serializer` de cette manière, et si la dépréciation entraînera une suppression de l’utilisation de la méthode de cette manière.

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [Juin 13, 2023, 8:40 UTC](https://meta.discourse.org/t/overriding-include-methods-in-serializers/268138/2 "2023-06-13T08:40:51Z")

</div>

> [@angus](#):
>
> J’apprécie que cette utilisation particulière puisse être repensée pour ne pas nécessiter de remplacer la méthode du sérialiseur du site, ou que le remplacement puisse être réalisé par d’autres moyens.

Oui, ce serait ma recommandation.

Nous avons récemment introduit un nouveau système pour les [‘modificateurs de plugin’](https://github.com/discourse/discourse/commit/795e6d72a4a0665997fa72fafd5d7bf71a8a4e4c), qui sont des points d’extension très peu coûteux et similaires à DiscourseEvent **mais** ils prennent une valeur d’entrée et retournent une valeur. Donc, dans votre cas, vous pourriez faire une PR principale pour ajouter un appel `DiscoursePluginRegistry.apply_modifier` dans la méthode `include_` pertinente, puis vous pouvez utiliser `register_modifier` dans votre plugin pour remplacer la valeur.

> [@angus](#):
>
> la dépréciation entraînera la suppression de l’utilisation de la méthode de cette manière.

Il est probable que nous la bloquions complètement à terme, oui. De plus, vous ne voudriez vraiment pas utiliser une méthode qui génère du bruit de dépréciation dans les journaux.

Si vous devez absolument remplacer une méthode sans la coopération du cœur, alors `modify_class` semblerait être le meilleur choix. La principale raison pour laquelle nous avons un `add_to_serializer` dédié est qu’il définit automatiquement une méthode `include_*` afin qu’elle ne s’applique que lorsque le plugin est activé.

Cela signifie que l’extrait de code que vous avez lié définit actuellement deux méthodes. `include_wizard_required?` et `include_include_wizard_required?` 😅

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [Juin 13, 2023, 8:53 UTC](https://meta.discourse.org/t/overriding-include-methods-in-serializers/268138/3 "2023-06-13T08:53:57Z")

</div>

Ce Readme indique qu’il « fonctionne comme une pile (premier entré, premier sorti) », mais c’est une file d’attente. Une pile est premier entré, dernier sorti. (Je n’arrive même pas à copier le texte sur mon téléphone).

---

<div class="post-metadata">

### Author: ![Lilly](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/lilly/32/575047_2.png) [@Lilly](https://meta.discourse.org/u/Lilly)
#### Post date: [Juin 13, 2023, 9:00 UTC](https://meta.discourse.org/t/overriding-include-methods-in-serializers/268138/4 "2023-06-13T09:00:41Z")

</div>

bonne remarque. oui, la pile est LIFO et la file d’attente est FIFO

> Caractéristiques clés de ces modificateurs :
> 
> - Fonctionnent dans une pile (premier enregistré, premier appelé)
> - Désactivés automatiquement lorsque le plugin est désactivé
> - Transmettent le résultat cumulé de toutes les invocations de bloc à l’appelant

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [Juin 13, 2023, 9:15 UTC](https://meta.discourse.org/t/overriding-include-methods-in-serializers/268138/5 "2023-06-13T09:15:03Z")

</div>

C’est plutôt une « pile middleware » : une série de méthodes qui sont exécutées dans l’ordre, chacune passant son résultat à l’entrée de la méthode suivante.

Je ne pense pas qu’essayer d’appliquer la terminologie LIFO/FIFO ici fonctionnera : rien n’est ajouté/retiré de la « pile » - il n’y a pas de « sortie ».

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [Juin 13, 2023, 9:27 UTC](https://meta.discourse.org/t/overriding-include-methods-in-serializers/268138/6 "2023-06-13T09:27:30Z")

</div>

> [@david](#):
>
> C’est plutôt une « pile middleware »

Oh. Donc pas une structure de données de pile.

J’ai commencé à dire quelque chose sur la façon dont j’ai obtenu mon diplôme en informatique en 1987 et que je ne savais pas ce que les gens apprenaient maintenant. 😂

---

<div class="post-metadata">

### Author: ![Lilly](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/lilly/32/575047_2.png) [@Lilly](https://meta.discourse.org/u/Lilly)
#### Post date: [Juin 13, 2023, 9:33 UTC](https://meta.discourse.org/t/overriding-include-methods-in-serializers/268138/7 "2023-06-13T09:33:07Z")

</div>

C’est un peu mon problème. J’ai eu un écart de près de 10 ans récemment où je ne me suis presque pas approché d’un ordinateur (après plus de 25 ans à travailler avec eux) et j’ai l’impression qu’il me manque une énorme base de connaissances.

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [Juillet 13, 2023, 9:33 UTC](https://meta.discourse.org/t/overriding-include-methods-in-serializers/268138/8 "2023-07-13T09:33:38Z")

</div>

Ce sujet a été automatiquement fermé 30 jours après la dernière réponse. Les nouvelles réponses ne sont plus autorisées.
