我开始用symfony构建我的第一个Web应用程序。在这个应用程序中,我获得了具有身份验证和多语言功能的用户管理。在用户数据库表中是每个用户的lang列。我通过_GET参数更改了默认语言,并通过运行数据库值的登录名对其进行了更改。 现在,我想通过在EventSubscriber中通过URL _GET参数切换语言来自动更改数据库中的值。 不幸的是,我不知道如何在“ onKernelRequest”函数中获取用户实体,以将选择语言保存在数据库中。 更改语言的所有逻辑均通过以下代码完成:
PARTITION BY LIST(is_big_data)
SUBPARTITION BY KEY(district_id)
SUBPARTITIONS 10
(
PARTITION pNormal VALUES IN (0),
PARTITION pBigData VALUES IN (1)
);
预先感谢 彼得
答案 0 :(得分:1)
首先,我将拆分LocaleSubscriber
类,并将onKernelRequest
和onInteractiveLogin
移动到单独的侦听器/订户中,以减少对每个服务的依赖。
要在onKernelRequest
事件中获得当前用户,您需要注入TokenStorage
服务:
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class LocaleSubscriber implements EventSubscriberInterface
{
private $tokenStorage;
private $em;
public function __construct(
TokenStorageInterface $tokenStorage,
EntityManagerInterface $em
) {
$this->tokenStorage = $tokenStorage;
$this->em = $em;
}
public function onKernelRequest(GetResponseEvent $event)
{
if (!$event->isMasterRequest()) {
return;
}
if (!$token = $this->tokenStorage->getToken()) {
return ;
}
if (!$token->isAuthenticated()) {
return ;
}
if (!$user = $token->getUser()) {
return ;
}
$request = $event->getRequest();
// update user
$user->setLocale($locale);
$this->em->flush($user);
}
}
请注意,这未经测试。
答案 1 :(得分:0)
空令牌的问题是错误的事件。我切换到“ KernelEvents :: CONTROLLER”。现在我有了用户实体。 我的工作代码:
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class UserLocaleSubscriber implements EventSubscriberInterface
{
private $tokenStorage;
private $em;
private $allowedLangs;
public function __construct(TokenStorageInterface $tokenStorage, EntityManagerInterface $em)
{
$this->tokenStorage = $tokenStorage;
$this->em = $em;
$this->allowedLangs = ['de', 'en'];
}
public function onKernelController(FilterControllerEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
if(array_key_exists('_locale', $_GET) && array_search($_GET['_locale'], $this->allowedLangs) !== FALSE) {
if (!$event->isMasterRequest()) {
return;
}
if (!$token = $this->tokenStorage->getToken()) {
return ;
}
if (!$token->isAuthenticated()) {
return ;
}
if (!$user = $token->getUser()) {
return ;
}
$locale = $_GET['_locale'];
// update user
$user->setLocale($locale);
$this->em->flush($user);
$request->setLocale($locale);
$request->getSession()->set('_locale', $locale);
}
}
public static function getSubscribedEvents()
{
return array(
// must be registered before (i.e. with a higher priority than) the default Locale listener
KernelEvents::CONTROLLER => array(array('onKernelController', 1)),
);
}
}
答案 2 :(得分:0)
实体存在于LifecycleEventArgs中。
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();