Sto tentando di inserire l'utente attualmente connesso in un servizio. Il mio obiettivo è estendere alcune funzionalità di ramoscello per produrlo in base alle preferenze dell'utente. In questo esempio voglio stampare qualsiasi funzione di data usando il fuso orario specifico dell'utente.Symfony2: Inject current user in Service
Non sembra esserci alcun modo per iniettare l'utente corrente in un servizio, il che mi sembra davvero strano. Quando si inserisce il contesto di sicurezza, non ha un token anche se l'utente ha effettuato il login
Sto usando il pacchetto utente FOS.
services:
...
twigdate.listener.request:
class: App\AppBundle\Services\TwigDateRequestListener
arguments: [@twig, @security.context]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
<?php
namespace App\AppBundle\Services;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
class TwigDateRequestListener
{
protected $twig;
function __construct(\Twig_Environment $twig, SecurityContext $context) {
$this->twig = $twig;
//$this->user = $context->get...;
var_dump($context); die;
}
public function onKernelRequest(GetResponseEvent $event) {
// $this->twig->getExtension('core')->setDateFormat($user->getProfile()->getFormat());
// $this->twig->getExtension('core')->setTimeZone($user->getProfile()->getTimezone());
}
}
output:
object(Symfony\Component\Security\Core\SecurityContext)[325]
private 'token' => null
private 'accessDecisionManager' =>
object(Symfony\Component\Security\Core\Authorization\AccessDecisionManager)[150]
private 'voters' =>
array
0 =>
object(Symfony\Component\Security\Core\Authorization\Voter\RoleHierarchyVoter)[151]
...
1 =>
object(Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter)[153]
...
2 =>
object(Symfony\Component\Security\Acl\Voter\AclVoter)[155]
...
private 'strategy' => string 'decideAffirmative' (length=17)
private 'allowIfAllAbstainDecisions' => boolean false
private 'allowIfEqualGrantedDeniedDecisions' => boolean true
private 'authenticationManager' =>
object(Symfony\Component\Security\Core\Authentication\AuthenticationProviderManager)[324]
private 'providers' =>
array
0 =>
object(Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider)[323]
...
1 =>
object(Symfony\Component\Security\Core\Authentication\Provider\AnonymousAuthenticationProvider)[149]
...
private 'eraseCredentials' => boolean true
private 'alwaysAuthenticate' => boolean false
Mi manca qualcosa?
Grazie a questo ha funzionato perfettamente. Ancora non capisco perché il mio primo esempio non abbia restituito l'oggetto utente, ma l'ho fatto funzionare e penso che Twig Extension sia in realtà un approccio più pulito. Grazie per la rapida risposta – n0xie
Beh, stavi ascoltando l'evento 'kernel.request'. L'impostazione del token di contesto mediante autenticazione o lettura del token dalla sessione viene eseguita dopo che tutti gli ascoltatori 'kernel.request' sono stati inviati. Se hai ascoltato l'evento 'kernel.response', avresti ottenuto il token desiderato. Mi dispiace anche di aver letto male la tua domanda. È una brutta giornata per me :) –
Questo ha senso. Grazie per l'esplorazione. Impari qualcosa ogni giorno – n0xie