gpt4 book ai didi

php - 在 Zend 框架应用程序中记录设计模式

转载 作者:可可西里 更新时间:2023-10-31 23:10:12 26 4
gpt4 key购买 nike

我正在使用 Zend Framework 构建应用程序。应用程序需要对代码中的每个操作或功能进行密集记录。

所以我的代码大部分时间是这样的:

function SendMailsAction(){
$logger->log('Started sending mails.')
...
...
...Some Code...
...
...

foreach ($mails as $mail){
try{
$logger->log('Trying to send')
$mail->send()
$logger->log('Mail sent successfully.')
}catch(Exception $e){
$logger->log('Failed to send mail.')
}
}

...
...
...Some Code...
...
...
$logger->log('Finished sending mails.')
}

有时我什至要登录 2 个表,所以大部分日志代码都加倍,功能开始变得复杂和冗长。

我使用 Zend 框架的 Zend_Log 进行日志记录,所以我的问题不是日志记录类本身,而是如何将日志记录代码与代码功能本身分开并保持关注点分离。

有些人建议使用面向方面编程 (AOP),但不幸的是,我的客户无法接受面向 PHP 的 AOP,因此我正在寻找面向对象的解决方案或最佳实践。

注意:

我的问题不是如何使用 Zend_Log,而是如何将日志添加到我的应用程序代码中。

最佳答案

Sometimes I even have to log in 2 tables, so most of the logging code is doubled and the functions start to get complicated and long.

会很长。如果您的代码进行了大量日志记录,那么它将会很长,因为它必须记录,并且它记录的每一行操作都意味着您的代码中有一行。然而,它不应该在任何情况下变得复杂,因为日志记录是您可以做的最直接的事情之一。让我担心的是,您提到“有时我什至必须登录 2 个表”。在我的书中,一张、两张、五张、六十张或一千张表格是由一个行执行的。每个记录器的代码不会加倍。如果您正在复制粘贴一行,并将 $log 更改为 $log2,那么您显然做错了 (tm)。

Some people suggested Aspect Oriented Programming (AOP), but unfortunately AOP for PHP isn't acceptable for my costumer, so I'm looking for an Object Oriented solution or best practice.

这很好,AOP。但它有缺点;与 debug_backtrace 方法一样,性能受到严重影响。那,加上代码变得越来越“神奇”,因为当您查看代码本身时,它会做一些不清楚的事情。这会增加您调试应用程序的时间。

我的 0.02 美元?首先,不要重复自己:每个操作一个日志条目就足够了。使用可以在运行时附加到某些类的灵活记录器。根据“严重性”或“类型”决定是否实际在记录器中记录消息。总而言之,只需实现观察者模式即可:

<?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( );

关于php - 在 Zend 框架应用程序中记录设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9310433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com