Symfony2 олицетворяет слушателя с внедрением параметров

В настоящее время я работаю над пользовательской логикой подражать слушателю.

я переопределил Symfony \ Component \ Security \ Http \ Firewall \ SwitchUserListener, потому что я хотел бы выполнить вызов некоторых репозиториев объектов (не объекта User) перед авторизацией события переключения:

например, я хотел бы авторизовать коммутатор в том и только в том случае, если пользователь для олицетворения уже дал права пользователю, запрашивающему коммутатор.

Можно ли ввести новые параметры, такие как Doctrine Service или некоторые значения массивов, переопределенному слушателю?

вызов моего пользовательского SwitchUserListenener:

in services.yml

parameters:
security.authentication.switchuser_listener.class: acme\appBundle\EventListener\SwitchUserListener

0

Решение

Ваше решение может быть здесь:
https://github.com/symfony/symfony/blob/2.6/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php#L597

Сервис security.authentication.switchuser_listener определяется Symfony является абстрактным сервисом. На самом деле это не служба, используемая в качестве прослушивателя, а тот же класс.

Поднимитесь в коде немного, чтобы:
https://github.com/symfony/symfony/blob/2.6/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php#L233

foreach ($firewalls as $name => $firewall) {
list($matcher, $listeners, $exceptionListener) = $this->createFirewall($container, $name, $firewall, $authenticationProviders, $providerIds);

Это имя созданного вами брандмауэра, на котором будет возможно переключение пользователя.

Теперь у вас есть несколько вариантов переопределить слушателя.
Вы можете продолжать переопределять параметр класса, а затем манипулировать аргументами, как это делает Symfony:

$listener->replaceArgument(1, new Reference($userProvider));
$listener->replaceArgument(3, $id);
$listener->replaceArgument(6, $config['parameter']);
$listener->replaceArgument(7, $config['role']);

Или, проще, скомпилируйте дополнительные вызовы методов в вашем расширении.

Другое решение, было бы создать CompilerPass который систематически удаляет исходных слушателей и заменяет их собственными. Это может быть достигнуто в вашем собственном расширении связок, если оно загружено после SecurityBundle,

$container->removeDefinition($id);

РЕДАКТИРОВАТЬ:

Другое решение, возможно, более простое, чем приведенное выше, заключается в создании другого прослушивателя событий.
Тот, который срабатывает по запросу. Здесь важно то, что слушатель должен иметь более высокий приоритет по отношению к слушателям, которых вы переопределяете (я использовал слушателей, потому что у вас может быть несколько переключателей).

Сложнее будет получить список переопределенных идентификаторов слушателей, потому что вам нужно будет зациклить их и вызывать свои собственные методы для внедрения новых зависимостей после создания экземпляров слушателей, но до их срабатывания.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]