Estoy intentando inyectar el usuario actualmente conectado a un servicio. Mi objetivo es ampliar algunas funcionalidades de ramas para que se muestren en función de las preferencias del usuario. En este ejemplo, quiero mostrar cualquier función de fecha usando la zona horaria específica del usuario.Symfony2: Inyectar usuario actual en el Servicio
No parece haber ninguna forma de inyectar al usuario actual en un servicio, lo cual me parece realmente extraño. Al inyectar el contexto de seguridad, no tiene un token aunque el usuario haya iniciado sesión en
Estoy utilizando el paquete de usuario de 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
¿Falta algo?
Gracias, funcionó a la perfección. Todavía no entiendo por qué mi primer ejemplo no devolvió el objeto del usuario, pero lo hice funcionar, y creo que una extensión de Twig es en realidad un enfoque más limpio. Gracias por la respuesta rápida – n0xie
Bueno, estabas escuchando el evento 'kernel.request'. La configuración del token de contexto mediante la autenticación o lectura del token de la sesión se realiza después de que se envíen todos los oyentes 'kernel.request'. Si has escuchado el evento 'kernel.response', entonces tendrías el token deseado. También siento haber leído mal tu pregunta. Es un mal día para mí :). –
Eso tiene sentido. Gracias por la explicación. Aprendes algo cada día. – n0xie