Иногда мне даже приходится входить в 2 таблицы, поэтому большая часть кода регистрации удваивается, а функции становятся сложными и длинными.
Это будет долго. Если ваш код ведет много журналирования, он будет длинным, так как он должен регистрироваться, и каждое действие строки, которое он регистрирует, будет означать, что в вашем коде есть строка. Это, однако, не должно быть сложным в любом случае, так как ведение журнала является одной из самых простых вещей, которые вы можете сделать. Что меня беспокоит, так это то, что вы упоминаете: «Иногда мне даже нужно войти в 2 таблицы». В моей книге одна, две, пять, шестьдесят или тысяча таблиц выполняются строкой одна . Код не удваивается для каждого регистратора. Если вы копируете строку и меняете $log
на $log2
, вы явно ошибаетесь (тм).
Некоторые люди предлагают Аспектно-ориентированное программирование (AOP), но, к сожалению, AOP для 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( );