0

我想知道从 Symfony 应用程序处理 MySQL 异常的最佳方法是什么,少说,例如来自正常环境(不是开发)的这个:

哎呀!发生错误 服务器返回“500 内部服务器错误”。

在 _dev 翻译如下:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '343434' for key 'rut'

您如何处理此类错误以向最终用户显示消息或更友好的内容?

4

1 回答 1

2

您最好的选择是制作一个自定义错误页面,并可选择创建一个自定义错误处理程序来提醒您错误。

首先,创建一个自定义错误页面,只需在/path/to/project/config/error/error.html.php. 如果存在,Symfony 将自动使用您的错误页面而不是它自己的页面。

如果您想更高级一点,可以添加一个事件侦听器来处理未捕获的异常。为此,请编辑/path/to/project/config/ProjectConfiguration.class.php并添加一个侦听器,如下所示:

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    //...
    $this->dispatcher->connect('application.throw_exception', array($this, 'listenToException'));
  }

  public function listenToException(sfEvent $event)
  {
    $handler = new myExceptionHandler($event);
    $handler->doSomethingHere();
  }
}

然后,您所要做的就是创建自己的除参数myExceptionHandler之外的类。sfEvent $event你可以在这里做任何你想做的事情,我更喜欢给自己发一封电子邮件告诉我发生了错误。

这是一个简短的例子:

class myExceptionHandler
{
  protected $event;

  public function __construct(sfEvent $event)
  {
    $this->event = $event;
  }

  protected function getMailer()
  {
    return sfContext::getInstance()->getMailer();
  }

  public function notify()
  {
    $subject = 'Uncaught Exception';
    $body = $this->event->getSubject();

    $mailer = $this->getMailer();
    $mailer->composeAndSend('root@yourserver.com', 'you@youremail.com', $subject, $body);
  }
}

在此示例中,您只需$handler->notify()从项目配置中调用,它就会通过电子邮件将堆栈跟踪发送给您。您还可以包含其他信息,例如$_SERVER变量等...

于 2013-06-12T02:24:51.867 回答