考虑这个PrettyPageHandler
的简单子类
class NewErrorHandler extends \Whoops\Handler\PrettyPageHandler
{
public $foo = null;
public function __construct()
{
parent::__construct();
}
public function handle()
{
$this->foo = 'bar';
echo 'executed';
}
}
当这样使用时:
$errorHandler = new NewErrorHandler();
$whoops->pushHandler($errorHandler);
$whoops->register();
var_dump($errorHandler->foo);
$errorHandler->foo
为空,但打印了“已执行”。似乎$this->foo = 'bar';
在进程中没有执行或无效,即使它应该执行。有什么想法吗?
更新1
我正在尝试通过输出缓冲来获得handle();
的输出,该输出正常工作。但同时我想设置一个变量:
public function handle()
{
parent::handle();
$output = ob_get_clean();
echo 'executed';
$this->foo = 'bar';
}
$this->foo = 'bar';
目前似乎尚未执行,但会打印“已执行”。
更新2
我正在尝试确定错误是否尚未记录,如果为true,请执行诸如发送通知之类的操作(例如email / sms / etc)。如果错误已被记录,则表示它是重复的,不再发送通知。这里有一些代码,但是为了清楚起见进行了简化:
<?php
class NewErrorHandler extends \Whoops\Handler\PrettyPageHandler
{
private $errorHash;
private $isNewError;
public function __construct()
{
parent::__construct();
}
public function handle()
{
parent::handle();
$output = ob_get_clean();
$this->setErrorHash();
if (!$this->isDuplicateError()) {
$this->isNewError = true;
$this->log($output);
}
}
private function log(string $data): void
{
$filename = $this->errorHash . '.html';
file_put_contents('logs/errors/'. $filename, $data);
}
public function isDuplicateError(): bool
{
// code check if the file $this->errorHash.'.html' exists in logs/errors/
// ...
}
private function setErrorHash(): string
{
$ex = $this->getException();
$this->errorHash = md5($ex->getMessage() . $ex->getFile() . $ex->getLine() . $ex->getTraceAsString());
}
}
$errorHandler = new NewErrorHandler();
$whoops->pushHandler($errorHandler);
$whoops->register();
if ($errorHandler->isNewError == true)
{
// do something like send notifications... outside the child class.
}
问题是$errorHandler->isNewError
为空,即使应该为true
更新3:
我将尝试解释我对此的想法。这是我要执行的操作的基本示例。我们假设有一个名为Whoops
FakeWhoops
类
<?php
class FakeWhoops
{
private $handler;
public function pushHandler(CustomHandler $handler)
{
$this->handler = $handler;
}
public function triggerError()
{
$this->handler->handle();
}
}
这是我的自定义处理程序:
class CustomHandler
{
public $foo;
public function handle()
{
$this->foo = true;
echo 'executed';
}
}
现在让我们运行它并触发一个假错误:
$cH = new CustomHandler;
$fW = new FakeWhoops;
$fW->pushHandler($cH);
// let's trigger a fake error which should call CustomHandler::handle();
$fW->triggerError();
var_dump($cH->foo); // returns true, foo was set!
正如您在此处看到的那样,尽管我使用的是真实的Whoops
,但这正是我正在尝试做的事情。这是一个简单的想法。但是,为什么在简化的示例中却不能使用Whoops
呢?