php - Showing current user in log -
i'm trying create custom monolog processor attach current user error mailer.
when declaring service so:
monolog.processor.mail: class: myvendor\monolog\processor\mailprocessor arguments: - @mailer - @security.context tags: - { name: monolog.processor, method: processrecord }
i circular reference:
[symfony\component\dependencyinjection\exception\servicecircularreferenceexception] circular reference detected service "monolog.processor.mail", path: "router -> monolog.logger.router -> monolog.processor.mail -> security.context -> security.authentication.manager -> fos_user.user_provider.username_email-> fos_user.user_manager -> doctrine.orm.default_entity_manager -> doctrine.dbal.default_connection -> doctrine.dbal.logger -> monolog.logger.doctrine".
what best practice solution here?
a related forum thread: http://forum.symfony-project.org/viewtopic.php?t=40306&p=131081#p131143
this thread shows that:
- setter injection doesn't solve issue (i tried well)
- injecting container causes infinitive recursion (this have not confirmed)
also tried script http://pastebin.com/auvfgty3 user session.
if ($this->session !== null) { if ($this->session->has($this->securitykey)) { $token = unserialize($this->session->get($this->securitykey)); $this->currentuser = $token->getuser(); } }
this gave following error:
warning: ini_set(): session active. cannot change session module's ini settings @ time in c:\inetpub\symfony23\vendor\symfony\symfony\src\symfony\component\httpfoundation\session\storage\handler\nativefilesessionhandler.php on line 56
i understand security.context has not yet been build services request logger on. class it's not problem since set user undefined
. ideally security.context
setter injected after security.context
service has been created. can not change priority on logger constructed late because it's needed on. maybe question resolves to: how recreate service again after security.context has been initialized? not sure if scope prototype here??
create handler on kernel request , extract user:
// src/appbundle/monolog/userprocessor.php namespace appbundle\monolog; use symfony\component\httpkernel\event\getresponseevent; use symfony\component\security\core\authentication\token\storage\tokenstorageinterface; class userprocessor { private $tokenstorage; private $user; public function __construct(tokenstorageinterface $tokenstorage) { $this->tokenstorage = $tokenstorage; } public function __invoke(array $record) { if (null !== $this->user) { $record['extra']['user'] = $this->user->getusername(); } return $record; } public function onkernelrequest(getresponseevent $event) { if (null === $token = $this->tokenstorage->gettoken()) { return; } if (!is_object($user = $token->getuser())) { // e.g. anonymous authentication return; } $this->user = $user; } }
register new processor:
# app/config/services.yml services: monolog.processor.user: class: appbundle\monolog\userprocessor arguments: ["@security.token_storage"] tags: - { name: monolog.processor } - { name: kernel.event_listener, event: kernel.request, method: onkernelrequest }
symfony documentation has problem
Comments
Post a Comment