Я пытаюсь ввести текущего пользователя в службу. Моя цель состоит в том, чтобы расширить некоторые функциональные возможности, чтобы выводить их на основе пользовательских настроек. В этом примере я хочу вывести любую функцию даты, используя пользовательский часовой пояс.Symfony2: вводить текущего пользователя в Сервис
Нет никакого способа вставить текущего пользователя в сервис, что кажется мне очень странным. При вводе контекста безопасности он не имеет токена, даже если пользователь зарегистрирован в
Я использую пакет пользователя 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
Я что-то не хватает?
Спасибо, что работал отлично. Я до сих пор не понимаю, почему мой первый пример не возвращал объект пользователя, но я получил его работу, и я думаю, что расширение Twig на самом деле является более чистым подходом. Спасибо за быстрый ответ – n0xie
Ну, вы слушали событие kernel.request. Установка токена контекста с помощью аутентификации или чтения токена из сеанса выполняется после отправки всех отправителей 'kernel.request'. Если вы прослушали событие 'kernel.response', вы получили бы желаемый токен. Также извините за неправильный вопрос. Это плохой день для меня :). –
Это имеет смысл. Спасибо за объяснение. Вы узнаете что-то каждый день. – n0xie