Допустим, есть простой сайт по типу 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); // передаём константу кот.будет сод.общий вид сайта. в этот шаблоны вводятся парам.
}
}
?>
?>