blob: f3840c283d0df6c15fb6b48d477e015060d4ed5a [file] [log] [blame]
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +02001<?php
2
3namespace LdapRecord\Events;
4
5use LdapRecord\Auth\Events\Event as AuthEvent;
6use LdapRecord\Auth\Events\Failed;
7use LdapRecord\Models\Events\Event as ModelEvent;
8use LdapRecord\Query\Events\QueryExecuted as QueryEvent;
9use Psr\Log\LoggerInterface;
10use ReflectionClass;
11
12class Logger
13{
14 /**
15 * The logger instance.
16 *
17 * @var LoggerInterface|null
18 */
19 protected $logger;
20
21 /**
22 * Constructor.
23 *
24 * @param LoggerInterface|null $logger
25 */
26 public function __construct(LoggerInterface $logger = null)
27 {
28 $this->logger = $logger;
29 }
30
31 /**
32 * Logs the given event.
33 *
34 * @param mixed $event
35 *
36 * @return void
37 */
38 public function log($event)
39 {
40 switch (true) {
41 case $event instanceof AuthEvent:
42 return $this->auth($event);
43 case $event instanceof ModelEvent:
44 return $this->model($event);
45 case $event instanceof QueryEvent:
46 return $this->query($event);
47 }
48 }
49
50 /**
51 * Logs an authentication event.
52 *
53 * @param AuthEvent $event
54 *
55 * @return void
56 */
57 public function auth(AuthEvent $event)
58 {
59 if (isset($this->logger)) {
60 $connection = $event->getConnection();
61
62 $message = "LDAP ({$connection->getHost()})"
63 ." - Operation: {$this->getOperationName($event)}"
64 ." - Username: {$event->getUsername()}";
65
66 $result = null;
67 $type = 'info';
68
69 if (is_a($event, Failed::class)) {
70 $type = 'warning';
71 $result = " - Reason: {$connection->getLastError()}";
72 }
73
74 $this->logger->$type($message.$result);
75 }
76 }
77
78 /**
79 * Logs a model event.
80 *
81 * @param ModelEvent $event
82 *
83 * @return void
84 */
85 public function model(ModelEvent $event)
86 {
87 if (isset($this->logger)) {
88 $model = $event->getModel();
89
90 $on = get_class($model);
91
92 $connection = $model->getConnection()->getLdapConnection();
93
94 $message = "LDAP ({$connection->getHost()})"
95 ." - Operation: {$this->getOperationName($event)}"
96 ." - On: {$on}"
97 ." - Distinguished Name: {$model->getDn()}";
98
99 $this->logger->info($message);
100 }
101 }
102
103 /**
104 * Logs a query event.
105 *
106 * @param QueryEvent $event
107 *
108 * @return void
109 */
110 public function query(QueryEvent $event)
111 {
112 if (isset($this->logger)) {
113 $query = $event->getQuery();
114
115 $connection = $query->getConnection()->getLdapConnection();
116
117 $selected = implode(',', $query->getSelects());
118
119 $message = "LDAP ({$connection->getHost()})"
120 ." - Operation: {$this->getOperationName($event)}"
121 ." - Base DN: {$query->getBaseDn()}"
122 ." - Filter: {$query->getQuery()}"
123 ." - Selected: ({$selected})"
124 ." - Time Elapsed: {$event->getTime()}";
125
126 $this->logger->info($message);
127 }
128 }
129
130 /**
131 * Returns the operational name of the given event.
132 *
133 * @param mixed $event
134 *
135 * @return string
136 */
137 protected function getOperationName($event)
138 {
139 return (new ReflectionClass($event))->getShortName();
140 }
141}