Php MVC体系结构中记录数据库错误的位置

Php MVC体系结构中记录数据库错误的位置,php,model-view-controller,logging,error-handling,zend-framework2,Php,Model View Controller,Logging,Error Handling,Zend Framework2,或者任何关于这个问题的框架 以Zend Framework 2为例,我有以下表类: <?php namespace Contact\Model; use Zend\Db\TableGateway\TableGateway; use Zend\Db\TableGateway\AbstractTableGateway; use Zend\Log\Logger; class UserContactsTable extends AbstractTableGateway { prote

或者任何关于这个问题的框架

以Zend Framework 2为例,我有以下表类:

<?php

namespace Contact\Model;

use Zend\Db\TableGateway\TableGateway;
use Zend\Db\TableGateway\AbstractTableGateway;
use Zend\Log\Logger;

class UserContactsTable extends AbstractTableGateway
{
    protected $tableGateway;

    /**
     *
     * @var \Zend\Log\Logger Instance
     */
    protected $logger;

    public function __construct(TableGateway $tableGateway, Logger $logger )
    {
        $this->tableGateway = $tableGateway;
        $this->logger       = $logger;
    }

    /**
     * Save a contact
     * 
     * @param \Sms\Model\UserContact $userContact
     */
    public function saveUserContact(UserContact $userContact)
    {
        $data = array(
            'user_id'       => $userContact->user_id,
            'contact_id'    => $userContact->contact_id
        );

        try {
            $this->tableGateway->insert($data);
        } catch (\Exception $e) {
                    //log
            $this->logger->crit($omeErrMsg);

        }
    }
}
?>

我应该在这里登录吗?我应该把我的记录器绑在table类上吗? 如果insert失败,我应该让saveUserContact函数抛出一个异常,并捕获控制器并记录在那里吗

最好的做法是什么

我最初的想法是创建一个包含一些持续错误消息的类,例如日志记录器在表类中使用的插入和更新失败,但我不确定这里的正确过程是什么


这实际上并不局限于PHP或Zend Framework 2,而恰恰是我正在使用的语言。

一般来说,我觉得应该在发生故障的地方记录故障(除非它们是预期的,在这种情况下会很嘈杂),但要在堆栈上传播异常(或包装异常)因此,调用方可以决定是否忽略/重试/失败(并记录自己的、与业务逻辑更相关的消息)。

我认为系统的各个组件应该尽可能地解耦。因此,在本例中,如果
saveUserContact
发生故障,则可能会引发异常,因为这不是预期的行为。这个类不需要知道“链的上游”会发生什么,比如错误日志记录

正如您所提到的,最好抛出异常并在控制器(或者某种其他形式的侦听器)中捕获它,然后控制器将处理日志记录


这种方法的好处是,您的系统将更易于测试,因为在构建要测试的UserContactsTable(mock)对象时,要存根的对象将更少。

我担心在将我的logger对象传递到我的所有表并在那里而不是在控制器中登录之后,这将是答案。该死感谢您的澄清。绝对同意@RobMasters。如果您使用经典的多层体系结构:WebMVC-服务层-持久层,那么您的db持久层应该与日志逻辑解耦。正如RobMasters所建议的,我将在控制器级别捕获异常,然后将处理委托给日志服务,该服务根据异常的类型,将根据必要的逻辑记录必要的信息(电子邮件、写入文件、另一个专用数据库…)