Psr-3 как правильно подключить интерфейс протоколирования?

Допустим, есть простой сайт по типу mvc.
1 Как добавить в определённое место логирование?
2 Где наиболее правильно размещать операции записи в лог?
3 И что лучше- записывать логи в файл типа CSV или в базу данных?

loggerInterface.php
spoiler
<?php

// определяем интерфейс
namespace Psr\Log;

// реализуемые методы для того класса (mylog к прим., который даный интреф.будет реализ.
interface LoggerInterface
{
//$messege = 'User {name} not found;
public function emergency($message, array $context = []); // массив параметров кот.могут подставляться к примеру п.9 в ['name'='Вася'] подставляется. далее в п.9 {name} должно заменяться на конкр.знач.
public function alert($message, array $context = []); // по умолч.пустой массив
public function critical($message, array $context = []);
public function error($message, array $context = []);
public function warning($message, array $context = []);
public function notice($message, array $context = []);
public function info($message, array $context = []);
public function debug($message, array $context = []);
public function log($level, $message, array $context = []);
}

?>


loggerAwareInterface.php
spoiler
<?php
namespace Psr\Log;
//класс установщик того или иного класса реализ. LoggerInterface
interface LoggerAwareInterface
{
public function setLogger(LoggerInterface $logger);
}
?>


logLevel.php

spoiler
<?php
namespace Psr\Log;
//перечисляем все константы

class LogLevel
{
const EMERGENCY = 'emergency';
const ALERT = 'alert';
const CRITICAL = 'critical';
const ERROR = 'error';
const WARNING = 'warning';
const NOTICE = 'notice';
const INFO = 'info';
const DEBUG = 'debug';
}
?>


Далее - теоретический класс Mylog.php в котором loggerInterface должен реализовываться:

spoiler
<?php

use Psr\Log\LoggerInterface;

class Mylog
{
private $logger;

public function __construct(LoggerInterface $logger = null)
{
$this->logger = $logger;
}

public function doSomething()
{
if ($this->logger) {
$this->logger->info('Doing work');
}

// делает что-нибудь
}
}
?>


И к примеру, есть в проекте maincontroller_class.php В его классе нужно подключить логирование. Каким образом это делается?

spoiler
<?php

<?php

class MainController extends AbstractController {
// 3 сво-ва:
protected $title;
protected $meta_desc;
protected $meta_keywords;

// объявляем констр.
public function __construct() {
parent::__construct(new View(DIR_TMPL)); // вызываем род.констр. и перед.новый объект View c константой DIR_TMPL
// в конст.сод.путь к дир. template
}

public function action404() {
parent::action404(); // берём род.реализ.чтобы все заголовки были отпр.
$this->title = 'Страница не найдена - 404';
$this->meta_desc = 'Запрошенная страница не существует.';
$this->meta_keywords = 'страница не найдена, страница не существует, 404';
// получ.сод.из tmplfile
// файлик созд.отдельно
$content = $this->view->render('404', [], true); // обращаемся к св-ву protected view из п.6 род.класса
$this->render($content); // и вызываем у него метод рендер (п.11 view_class.php)
}


public function actionIndex() {
$this->title = 'Главная страница';
$this->meta_desc = 'Описание главной страницы';
$this->meta_keywords = 'описание, главная страниц';
// обращение к тому файлу кот.отвечает за вывод гл.стр:
$content = $this->view->render('index', [], true); // вызываем сод.стр. из tmpl file 'index.tmpl'
$this->render($content);
}

public function actionPage() {
$this->title = 'Внутренняя страница';
$this->meta_desc = 'Описание внутренней страницы';
$this->meta_keywords = 'описание, внутренняя страниц';
$email = 'abc@mail.ru'; // Допустим, получено из базы с помощью Model
$content = $this->view->render('page', ['email' => $email], true);
$this->render($content);
}
//
protected function render($content) {
$params = [];
$params['title'] = $this->title;
$params['meta_desc'] = $this->meta_desc;
$params['meta_keywords'] = $this->meta_keywords;
$params['content'] = $content;
$this->view->render(MAIN_LAYOUT, $params); // передаём константу кот.будет сод.общий вид сайта. в этот шаблоны вводятся парам.
}
}

?>
?>
  • Вопрос задан
  • 509 просмотров
Пригласить эксперта
Ответы на вопрос 1
ExileeD
@ExileeD
PHP/Python developer
Подключается в конструкторах через dependency injection
Примерно так, если вы конечно привязали реалиализацию и интерфейс
//Controller

public function __construction(LoggerInterface $logger){
$this->logger = $logger;
}
public function actionIndex() {

$this->logger->alarm('я ошибка');
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 10:32
400000 руб./за проект
24 апр. 2024, в 10:12
10000 руб./за проект