blob: b2082e5960344b765c30102125814ecc2f06ab6a [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:
Matthias Andreas Benkard1ba53812022-12-27 17:32:58 +010042 $this->auth($event);
43 break;
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020044 case $event instanceof ModelEvent:
Matthias Andreas Benkard1ba53812022-12-27 17:32:58 +010045 $this->model($event);
46 break;
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020047 case $event instanceof QueryEvent:
Matthias Andreas Benkard1ba53812022-12-27 17:32:58 +010048 $this->query($event);
49 break;
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020050 }
51 }
52
53 /**
54 * Logs an authentication event.
55 *
56 * @param AuthEvent $event
57 *
58 * @return void
59 */
60 public function auth(AuthEvent $event)
61 {
62 if (isset($this->logger)) {
63 $connection = $event->getConnection();
64
65 $message = "LDAP ({$connection->getHost()})"
66 ." - Operation: {$this->getOperationName($event)}"
67 ." - Username: {$event->getUsername()}";
68
69 $result = null;
70 $type = 'info';
71
72 if (is_a($event, Failed::class)) {
73 $type = 'warning';
74 $result = " - Reason: {$connection->getLastError()}";
75 }
76
77 $this->logger->$type($message.$result);
78 }
79 }
80
81 /**
82 * Logs a model event.
83 *
84 * @param ModelEvent $event
85 *
86 * @return void
87 */
88 public function model(ModelEvent $event)
89 {
90 if (isset($this->logger)) {
91 $model = $event->getModel();
92
93 $on = get_class($model);
94
95 $connection = $model->getConnection()->getLdapConnection();
96
97 $message = "LDAP ({$connection->getHost()})"
98 ." - Operation: {$this->getOperationName($event)}"
99 ." - On: {$on}"
100 ." - Distinguished Name: {$model->getDn()}";
101
102 $this->logger->info($message);
103 }
104 }
105
106 /**
107 * Logs a query event.
108 *
109 * @param QueryEvent $event
110 *
111 * @return void
112 */
113 public function query(QueryEvent $event)
114 {
115 if (isset($this->logger)) {
116 $query = $event->getQuery();
117
118 $connection = $query->getConnection()->getLdapConnection();
119
120 $selected = implode(',', $query->getSelects());
121
122 $message = "LDAP ({$connection->getHost()})"
123 ." - Operation: {$this->getOperationName($event)}"
124 ." - Base DN: {$query->getBaseDn()}"
125 ." - Filter: {$query->getQuery()}"
126 ." - Selected: ({$selected})"
127 ." - Time Elapsed: {$event->getTime()}";
128
129 $this->logger->info($message);
130 }
131 }
132
133 /**
134 * Returns the operational name of the given event.
135 *
136 * @param mixed $event
137 *
138 * @return string
139 */
140 protected function getOperationName($event)
141 {
142 return (new ReflectionClass($event))->getShortName();
143 }
144}