AdonisJS - Zurückgeben von Validierungsnachrichten gemäß dem Gebietsschema von Antl Provider

8

Ich wende Internationalisierung auf meine API an und habe einige Probleme im Zusammenhang mit Antl- und Validierungsnachrichten.

Bei Standardantwortnachrichten kehre ich gemäß dem vom Benutzer festgelegten Gebietsschema zurück. Ich habe eine Route zum Wechseln des Gebietsschemas erstellt und ein Cookie und eine globale Middleware festgelegt, um das Gebietsschema aus dem Cookie abzurufen. Anschließend gebe ich einfach die in den Gebietsschemaressourcen gespeicherte Nachricht zurück.

Globale Middleware:

class Locale {
  async handle ({ request, antl }, next) {
    const lang = request.cookie('lang')

    if (lang) {
      antl.switchLocale(lang)
    }

    await next()
  }
}

Route:

Route.get('/switch/:lang', ({ params, antl, request, response }) => {
  // Getting the current available locales
  const locales = antl.availableLocales()

  try {
    // Saving into cookies
    if (locales.indexOf(params.lang) > -1) {
      response.cookie('lang', params.lang, { path: '/' })
    }

    return response.status(200).send({ message: 'Locale changed succesfully' })
  } catch (err) {
    return response.status(err.status).send({ error: 'Something went wrong while trying to switch locales', data: { message: err.message || 'Error message not found', name: err.name } })
  }
})

Aber ich habe zwei Dateien mit Validierungsnachrichten:
PT - https://github.com/LauraBeatris/xpack-adonis-api/blob/develop/resources/locales/pt/validation.json
DE - https://github.com/ LauraBeatris / xpack-adonis-api / blob / Entwickeln / Ressourcen / Gebietsschemas / de / Validierung.json

Ich möchte die Validierungsnachrichten gemäß dem vom Benutzer festgelegten aktuellen Gebietsschema zurückgeben, aber das Problem ist, dass die get-Methode der Validator-Klasse nicht wie die anderen Middlewares auf das antl-Kontextobjekt zugreifen kann.

Nachrichtenmethode des Validators:

    get messages () {
    return Antl.list('validation')
  }

Wenn ich jedoch das Gebietsschema mit dem vom Middleware-Kontext bereitgestellten Antl-Objekt geändert habe, ändert sich dies nicht im globalen Anbieter, sodass die Validierungsnachrichten immer mit dem Standardgebietsschema zurückgegeben werden, anstatt dem vom Benutzer in der Middleware festgelegten . Ich möchte die Gebietsschema-Switch-Route in diesen globalen Antl-Anbieter integrieren, damit ich beispielsweise portugiesische Validierungsnachrichten zurückgeben kann.

Das ist das Repo meines Projekts: https://github.com/LauraBeatris/xpack-adonis-api

Laura Beatris
quelle

Antworten:

3

Um das AntlObjekt in der get messages()Methode des Validators zu verwenden, müssen Sie verwenden this.ctx.antl. Mögen :

var antl = this.ctx.antl;
...
antl.formatMessage(...)


Adonis speichert nicht die Sprache, die Antlzwischen Abfragen verwendet wird. Alle Routen müssen über die Middleware verfügen, die die Sprache anwendet (die von Ihnen erstellte). Beispiel:

Route.get('/user', 'UserController.Get').middleware(['Locale']); // Use cookie language

Route.get('/user', 'UserController.Get'); // Use default language

Wenn Sie möchten, dass alle Routen diese Middleware haben, müssen Sie sie hinzufügen start/kernel.js. : https://adonisjs.com/docs/4.1/middleware#_global_middleware

Zögern Sie nicht, wenn Sie weitere Informationen benötigen :)

CrBast
quelle
1
Vielen Dank! Habe ich in allen Klassen meiner App Zugriff auf die ctx-Instanz?
Laura Beatris
1
Gern geschehen :), meiner Erfahrung nach ja. Aber ich bin nicht 100% sicher
CrBast