# Substituto recomendado para modifyClass("model:composer") ao sobrescrever save()

**URL:** https://meta.discourse.org/t/recommended-replacement-for-modifyclass-model-composer-when-overriding-save/410125
**Category:** Development
**Tags:** composer
**Created:** [Agosto 15, 2026, 9:05am UTC](https://meta.discourse.org/t/recommended-replacement-for-modifyclass-model-composer-when-overriding-save/410125 "2026-08-15T09:05:05Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![jahan\_gagan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jahan_gagan/32/501948_2.png) [@jahan\_gagan](https://meta.discourse.org/u/jahan_gagan)
#### Post date: [Agosto 15, 2026, 9:05am UTC](https://meta.discourse.org/t/recommended-replacement-for-modifyclass-model-composer-when-overriding-save/410125/1 "2026-08-15T09:05:05Z")

</div>

Estou migrando para longe da `api.modifyClass("model:composer", ...)` obsoleta.

A minha substituição atual de `Composer#save` altera condicionalmente o comportamento de salvamento, mas, caso contrário, precisa chamar `super.save(opts)`.

Vejo as novas APIs `addModelMethod` / `addModelCallback`, mas não consigo encontrar um exemplo no núcleo do uso de `addModelMethod` para substituir um método existente mantendo o acesso à implementação original.

`addModelMethod` é destinado a substituir métodos de modelo existentes dessa forma? Se for, como um plugin deve delegar para a implementação original de `save()`?

Ou há outro ponto de extensão que deve ser usado para este caso de uso do Composer?

---

<div class="post-metadata">

### Author: ![awesomerobot](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/awesomerobot/32/142900_2.png) [@awesomerobot](https://meta.discourse.org/u/awesomerobot)
#### Post date: [Agosto 17, 2026, 6:06pm UTC](https://meta.discourse.org/t/recommended-replacement-for-modifyclass-model-composer-when-overriding-save/410125/2 "2026-08-17T18:06:33Z")

</div>

Acho que depende do que você quer fazer ao sobrescrever o método `save`…

Se você quer impedir o salvamento com base em alguma condição, pode usar nosso [transformador de valor](https://meta.discourse.org/t/using-transformers-to-customize-client-side-values-and-behavior/349954) `composer-service-cannot-submit-post`

Se você quer fazer algo depois que a publicação for criada, existe `api.onAppEvent("post:created")`

Se você está adicionando um campo, existe `api.serializeOnCreate`

Alguma dessas opções atende ao que você procura?

---

<div class="post-metadata">

### Author: ![jahan\_gagan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jahan_gagan/32/501948_2.png) [@jahan\_gagan](https://meta.discourse.org/u/jahan_gagan)
#### Post date: [Agosto 17, 2026, 6:59pm UTC](https://meta.discourse.org/t/recommended-replacement-for-modifyclass-model-composer-when-overriding-save/410125/3 "2026-08-17T18:59:31Z")

</div>

Obrigado! Já estou usando `composer-service-cannot-submit-post` — ele cuida da verificação em nível de serviço. Mas o `save()` do modelo do compositor também verifica `cantSubmitPost`, que inclui `missingReplyCharacters > 0`, então um corpo vazio ainda é bloqueado ali.

`onAppEvent("post:created")` é tarde demais porque a postagem nunca é criada, e `serializeOnCreate` apenas adiciona campos à solicitação, então não ajuda com a validação do comprimento do corpo.

Então, o problema restante é contornar `missingReplyCharacters` / `cantSubmitPost` para a primeira postagem. Existe um ponto de extensão suportado para isso?

Aqui está o inicializador atual para referência:

> <https://github.com/jahan-ggn/discourse-optional-topic-body/blob/main/assets/javascripts/discourse/api-initializers/optional-topic-body.gjs>

---

<div class="post-metadata">

### Author: ![jahan\_gagan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jahan_gagan/32/501948_2.png) [@jahan\_gagan](https://meta.discourse.org/u/jahan_gagan)
#### Post date: [Agosto 18, 2026, 1:07pm UTC](https://meta.discourse.org/t/recommended-replacement-for-modifyclass-model-composer-when-overriding-save/410125/4 "2026-08-18T13:07:29Z")

</div>

@david, ficaria grato por qualquer opinião que você possa ter sobre a melhor abordagem aqui.

---

<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: [Agosto 18, 2026, 2:31pm UTC](https://meta.discourse.org/t/recommended-replacement-for-modifyclass-model-composer-when-overriding-save/410125/5 "2026-08-18T14:31:17Z")

</div>

A melhor solução seria adicionar um novo hook ao núcleo do Discourse que permita alcançar o que você precisa de uma forma suportada. Que tal algo como este:

> <https://github.com/discourse/discourse/pull/42686>

Dessa forma, seu plugin faria o seguinte:

```js
api.registerValueTransformer(
  "composer-minimum-post-length",
  ({ value, context: { composer } }) => {
    if (
      composer.siteSettings.discourse_optional_topic_body_enabled &&
      composer.topicFirstPost
    ) {
      return 0;
    }

    return value; // Mantém a lógica do núcleo
  }
);

```

Me avise se isso funciona para o seu caso de uso e eu retiro o PR do rascunho para que ele possa ser revisado e mesclado.

---

<div class="post-metadata">

### Author: ![jahan\_gagan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jahan_gagan/32/501948_2.png) [@jahan\_gagan](https://meta.discourse.org/u/jahan_gagan)
#### Post date: [Agosto 19, 2026, 5:21am UTC](https://meta.discourse.org/t/recommended-replacement-for-modifyclass-model-composer-when-overriding-save/410125/6 "2026-08-19T05:21:20Z")

</div>

Obrigado, David! Testei o transformador `composer-minimum-post-length` e ele funciona — tópicos com corpos vazios são criados com sucesso.

Uma coisa que notei: o editor ainda exibe **“Post can’t be empty”** , porque a `validation` em `composer-editor` tem uma verificação `replyLength < 1` fixa que não usa `minimumPostLength`.

Essa verificação também poderia respeitar o transformador, ou ser ignorada quando `minimumPostLength` é `0`?

---

<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: [Agosto 19, 2026, 10:02pm UTC](https://meta.discourse.org/t/recommended-replacement-for-modifyclass-model-composer-when-overriding-save/410125/7 "2026-08-19T22:02:08Z")

</div>

> [@jahan\_gagan](#):
>
> Essa verificação também poderia levar em consideração o transformer, ou ser ignorada quando `minimumPostLength` é `0`?

Boa ideia - adicionei ao PR 👍

---

<div class="post-metadata">

### Author: ![jahan\_gagan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jahan_gagan/32/501948_2.png) [@jahan\_gagan](https://meta.discourse.org/u/jahan_gagan)
#### Post date: [Agosto 21, 2026, 4:54pm UTC](https://meta.discourse.org/t/recommended-replacement-for-modifyclass-model-composer-when-overriding-save/410125/9 "2026-08-21T16:54:38Z")

</div>

Agora funciona perfeitamente. Muito obrigado por adicionar isso, @david! 🙌

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [Agosto 23, 2026, 4:54pm UTC](https://meta.discourse.org/t/recommended-replacement-for-modifyclass-model-composer-when-overriding-save/410125/10 "2026-08-23T16:54:50Z")

</div>

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.
