Здравствуйте! Мне нужно покрыть проект логами. В некоторых участках кода нужно делать запись данных в базу. Я выделил несколько сущностей, которые мне нужно логировать:
1. Запрос пользователя
2. Ответ сервера пользователю
3. Исключения
4. Ответы платежной системы
Наверное еще что-нибудь нужно будет логировать потом, но пока так.
Я решил делать так:
interface LoggerInterface
{
public function log($data);
}
class RequestLogger implements LoggerInterface
{
public function log($request)
{
$activeRecord->insert(
'request_id' => $request->id,
'headers' => $request->headers,
//...
);
}
}
class ResponseLogger implements LoggerInterface
{
public function log($request, $response)
{
$activeRecord->insert(
'request_id' => $request->id,
'headers' => $response->headers,
//...
);
}
}
class ExceptionLogger implements LoggerInterface
{
public function log($exception)
{
$activeRecord->insert(
'message' => $exception->getLine() . ' ' . $exception->getMessage(),
//...
);
}
}
class CloudPaymentsLogger implements LoggerInterface
{
public function log($data)
{
$activeRecord->insert(
'status' => $data->status,
'data' => $data->message,
//...
);
}
}
Теперь я оборачиваю нужные мне роуты в middleware, вызываю там RequestLogger и ResponseLogger, а внутри кода логгирую данные, которые приходят от платежной системы с помощью CloudPaymentsLogger, а исключения, которые падают в catch, ловлю с помощью ExceptionLogger.
Я чувствую, что делаю какую-то ересь и все это неправильно. Во-первых, ResponseLogger принимает 2 аргумента, а все остальные классы один. Во-вторых, почему-то PhpStorm ругается, что имя аргумента в интерфейсе и классах разное. В третьих, все эти классы различаются лишь тем, как они обрабатывают данные. Наверное можно сделать один класс и ему передавать форматированные данные.
Подскажите, пожалуйста, как правильно?