Вы можете переопределить услугу следующим образом. Вам может понадобиться посмотреть / изменить конкретный порядок служебных аргументов, так как он меняется между версиями Symfony. Некоторые аргументы, такие как $providerKey
, можно оставить пустыми, так как они будут автоматически изменены / введены symfony.
Чтобы сэкономить некоторое время, вам не нужно переопределять конструктор, если вы используете установку сеттера.
Взгляд на значение по умолчанию Symfony SwitchUserListener (переключение на тег / версию, используемую в вашем приложении) поможет при реализации вашего нового метода handle
.
# app/config/services.yml
services:
# [..]
security.authentication.switchuser_listener:
class: 'Your\Namespace\SwitchUserListener'
public: false
abstract: true
arguments:
- '@security.context'
- ~
- '@security.user_checker'
- ~
- '@security.access.decision_manager'
- '@?logger'
- '_switch_user'
- ~
- '@?event_dispatcher'
- ~
calls:
- [ 'setEntityManager', [ '@doctrine.orm.entity_manager' ]]
tags:
- { name: monolog.logger, channel: security }
Теперь ваш SwitchUserListener может выглядеть так:
namespace Your\Namespace;
use Symfony\Component\Security\Http\Firewall\SwitchUserListener as DefaultListener;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
class SwitchUserListener extends DefaultListener
{
/** @var EntityManagerInterface */
protected $em;
public function setEntityManager(EntityManagerInterface $em)
{
$this->em = $em;
}
/**
* Handles the switch to another user.
*
* @throws \LogicException if switching to a user failed
*/
public function handle(GetResponseEvent $event)
{
// Do your custom switching logic here
}
}
Не забудьте очистить кеш!