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

Popular posts from this blog

windows - Single EXE to Install Python Standalone Executable for Easy Distribution -

c# - Access objects in UserControl from MainWindow in WPF -

javascript - How to name a jQuery function to make a browser's back button work? -