Иногда мне даже приходится регистрироваться в 2 таблицах, поэтому большая часть кода регистрации удваивается, и функции начинают усложняться и длиться.
Это будет долго. Если ваш код делает много протоколирования, он будет быть длинным, так как он должен будет регистрироваться, и каждое действие строки, которое он регистрирует, будет означать, что в вашем коде есть строка.Однако он не должен быть сложным в любом случае, поскольку регистрация является одной из самых простых вещей, которую вы можете сделать. Меня беспокоит то, что вы упоминаете «иногда мне даже приходится входить в 2 таблицы». В моей книге одна, две, пять, шестьдесят или одна тысяча столов выполняется одна линия. Код не удваивается для каждого регистратора. Если вы копируете строку и меняете $log
на $log2
, вы явно делаете это неправильно (tm).
Некоторые люди предлагали аспектно-ориентированное программирование (АОП), но, к сожалению, АОП для PHP не подходит для моего заказчика, поэтому я ищу объектно-ориентированное решение или лучшую практику.
Хорошо, АОП. У него есть минусы; как и при использовании метода debug_backtrace, наблюдается сильный удар по производительности. Это плюс код становится все более «волшебным» в том, что он делает вещи, которые не ясны, когда вы смотрите на сам код. Это увеличивает время отладки вашего приложения.
Мои $ 0,02? Прежде всего, не повторяйте себя: достаточно одной записи в журнале за действие. Используйте гибкие регистраторы, которые можно привязать к определенным классам во время выполнения. Определите, действительно ли зарегистрировать сообщение в регистраторе на основе «серьезности» или «типа». В общем, просто реализовать шаблон Observer:
<?php
namespace Foo;
class MailService {
public function attach(Observes $observer) {
$this->observers[] = $observer;
}
public function notify($message, $type = 'notice') {
foreach($this->observers as $observer) {
$observer->notify($message, $type);
}
}
public function sendMail() {
$this->notify('Started sending mails', 'debug');
$mails = array();
foreach($mails as $mail) {
try {
$this->notify('Trying to send', 'debug');
$mail->send();
$this->notify('Mail sent succesfully', 'debug');
}
catch(Exception $e) {
$this->notify('Failed to send mail', 'notice');
}
}
$this->notify('Finished sending mail', 'debug');
}
}
interface Observes {
public function notify($message, $type = 'notice');
}
abstract class Logger implements Observes {
protected $types = array(
'debug' => 0,
'notice' => 1,
'warning' => 2,
'error' => 3
);
protected function code($type) {
return isset($this->types[$type]) ? $this->types[$type] : 0;
}
}
class FileLogger extends Logger implements Observes {
public function __construct($filename) {
$this->filename = $filename;
}
/**
* @todo replace the method body with a call to, say, file_put_contents.
*/
public function notify($message, $type = 'notice') {
if($this->code($type) > $this->code('notice')) { // only for warning and error.
echo $message . "\n";
}
}
}
class DebugLogger extends Logger implements Observes {
public function notify($message, $type = 'notice') {
if($this->code($type) === $this->code('debug')) { // only show "debug" notices.
echo $message . "\n";
}
}
}
$service = new MailService();
$service->attach(new FileLogger('yourlog.txt'));
$service->attach(new DebugLogger());
$service->sendMail();
Что вы думаете, что ваш код должен выглядеть? Есть ли какой-то желательный бит кода? – akond
@akond well Я думал о «прикреплении» функций журнала к определенным функциям в моделях или контроллерах. что-то вроде регистрации функций для работы в определенных точках кода. Если любой из них даже применим в PHP, конечно. – Songo
Хороший вопрос, и я думаю, что ZF2 будет обрабатывать эту проблему гораздо шире с помощью [EventManager] (http://mwop.net/blog/266-Using-the-ZF2-EventManager#toc_1.6). –