Sto tentando di impostare le impostazioni internazionali in base alle preferenze dell'utente corrente che sono memorizzate nel DB.symfony 2 imposta le impostazioni locali in base alle preferenze utente memorizzate nel DB
La nostra classe Utente ha quindi un linguaggio getPreferred che restituisce un identificativo di locale ('en', 'fr_FR', ecc.).
Ho considerato il seguente approccio:
- registrare un "locale" servizio di ascolto che sottoscrive i KernelEvents :: evento RICHIESTA.
- questo servizio ha accesso al contesto di sicurezza (tramite il suo costruttore)
- questo metodo onKernelRequest di questo servizio tenta di richiamare l'utente dal contesto di sicurezza, ottenere le impostazioni locali preferite dell'utente e impostarlo come locale della richiesta.
Sfortunatamente, questo non funziona. Quando viene richiamato il metodo onRequestEvent del servizio listener "locale", il contesto di sicurezza non ha un token. Sembra che il listener di contesto sia invocato in una fase molto avanzata (con una priorità pari a 0), ed è impossibile dire al mio listener "locale" di essere eseguito prima del contesto di sicurezza.
Qualcuno sa come risolvere questo approccio o suggerirne un altro?
Ho trovato una risposta imperfetta al mio problema, per quello che vale: Nel listener di eventi del kernel, posso ottenere il token di sicurezza dalla sessione e digitalizzarlo, e quindi ottenere l'utente. Sfortunatamente, questo si basa sulla conoscenza del "contextKey" per il firewall, che è praticamente codificato. Ad esempio, se il firewall è "principale", il token può essere ottenuto dalla sessione con: token $ = $ session-> get ('_ security_main'); Questa logica viene rimossa da ContextListener. Ma il listener di contesto ottiene l'id del firewall passato durante la configurazione. – user1447137
Hai provato a iniettare security_context? Quindi puoi ottenere il token e l'utente semplicemente dal contesto. –
Pazi, l'iniezione del contesto di sicurezza non funziona. Questo è il punto centrale di questo biglietto. – user1447137