У меня есть приложение Symfony2. Я хочу установить локаль, когда пользователь входит в last_login_locale, которая хранится в БД.
Здесь services.yml:
login_listener:
class: AppBundle\EventListener\AuthListener
arguments:
- @request_stack
- @users_manager
- @session
tags:
- { name: kernel.event_subscriber }
Вот AuthListener.php:
<?php
namespace AppBundle\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\AuthenticationEvents;
use Symfony\Component\HttpFoundation\RequestStack;
use AppBundle\Doctrine\DBAL\DBALManager;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Symfony\Component\HttpFoundation\Session\Session;
class AuthListener implements EventSubscriberInterface
{
protected $requestStack;
protected $usersManager;
protected $session;
public function __construct(RequestStack $requestStack, DBALManager $usersManager, Session $session)
{
$this->requestStack = $requestStack;
$this->usersManager = $usersManager;
$this->session = $session;
}
public static function getSubscribedEvents()
{
return [
AuthenticationEvents::AUTHENTICATION_SUCCESS => 'onAuthenticationSuccess',
];
}
public function onAuthenticationSuccess($event)
{
// even empty function cause error
// here i get locale from db and set to session
}
}
Я получаю ошибку [GET] / _wdt / f3a2ee 404 Not found, даже если я оставляю onAuthenticationSuccess пустым. Ошибка возникает только на странице входа в систему.
Кажется, это работает нормально для меня на Symfony 2.7
namespace Acme\YourBundle\Listeners;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
use Symfony\Component\Security\Core\AuthenticationEvents;
use Symfony\Component\Security\Core\Event\AuthenticationEvent;
class AuthenticationListener implements EventSubscriberInterface
{
public function onAuthenticationSuccess(AuthenticationEvent $event) {
if(!$event->getAuthenticationToken() instanceof AnonymousToken) {
// Apply action only when the user is actually authenticated and not a guest.
// If the user is authenticated, the token will be `UsernamePasswordToken`.
}
}
public static function getSubscribedEvents() {
return array(
AuthenticationEvents::AUTHENTICATION_SUCCESS => 'onAuthenticationSuccess'
);
}
}
В services.yml
:
acme.security.authentication_event_listener:
class: Acme\YourBundle\Listeners\AuthenticationListener
tags:
- { name: kernel.event_subscriber, event: security.authentication.success, method: onAuthenticationSuccess }
Я говорю по-испански, но я постараюсь ответить на английском, извините, если я напишу что-то не так.
Я думаю, что эта ошибка связана с тем, что у вас есть проблемы с классами, которые у вас есть в качестве параметров в __construct, поэтому вам нужно проверить эти классы, чтобы увидеть, есть ли в них ошибка.
Я не знаю, почему ваш класс DBAL, кажется, имеет проблемы, так как он выделен синим цветом.
В моем случае проблема заключалась в том, что я забыл пространство имен класса и у меня была такая же ошибка.
Я надеюсь, что это поможет вам.