在用户登录时在zend logger中设置额外的字段

时间:2018-12-22 19:13:27

标签: logging zend-framework zend-framework3

我正在尝试在用户登录时更新列映射值。

当前,我的记录器初始化如下:

$columnMap = [
                'timestamp' => 'timestamp',
                'priority' => 'priority',
                'priorityName' => 'priorityName',
                'message' => 'message',
                'extra' => array(
                    'userid' => 'userid'
                )
];

$writer = new \Zend\Log\Writer\Db($dbAdapter,'logs',$columnMap);
$formatter = new \Zend\Log\Formatter\Db();
$formatter->setDateTimeFormat("Y-m-d H:i:s");
$writer->setFormatter($formatter);
$this->logger->addWriter($writer);

我想做的是在用户登录时更新userid extra field。最有可能发生在Module Class内部。可以通过服务管理器访问记录器。

1 个答案:

答案 0 :(得分:1)

似乎您需要一个侦听器。与此类似的东西可能适合您的需求:

<?php

namespace Authentication\Listener;

use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\ListenerAggregateInterface;
use Zend\Mvc\MvcEvent;

class addFieldListener implements ListenerAggregateInterface
{
    //@todo add annotations
    protected $logger;

    /**
     * @var array
     */
    protected $listeners = [];

    // @todo strict type
    public function __construct($logger)
    {
        $this->setLogger($logger);
    }

    //You might have to change the priority, which is currently 1,
    public function attach(EventManagerInterface $events, $priority = 1)
    {
        $this->listeners[] = $events->attach(MvcEvent::EVENT_ROUTE, [$this, 'addField'], $priority);
    }

    public function detach(EventManagerInterface $events)
    {
        foreach ($this->listeners as $index => $listener) {
            if ($events->detach($listener)) {
                unset($this->listeners[$index]);
            }
        }
    }

    public function addField()
    {
        //Get logger and add field.
    }

    //Getters & setters.. ?
}

配置:module.config.php

<?php

use Authentication\Listener\addFieldListener;

return [
    'listeners' => [
        addFieldListener::class,
    ],
    'service_manager' => [
        'factories' => [
            addFieldListener::class => addFieldListenerFactory::class,
        ],
    ],
];

注意:确保工厂将记录器提供给侦听器。