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