扩展Whoops PrettyPageHandler时,属性为null

时间:2018-11-28 21:49:53

标签: php error-handling whoops

考虑这个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呢?

0 个答案:

没有答案