Symfony2 PHPエラーを捕まえます

Debugコンポーネント を利用して、PHPエラーを捕まえてみようと思います。

You should never enable the debug tools in a production environment as they might disclose sensitive information to the user.

ということなので、カスタマイズした例外ハンドラに置き換えます。

実装コード

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Debug\ExceptionHandler;
use Symfony\Component\Debug\ErrorHandler;

class YourExceptionHandler extends ExceptionHandler
{
    public function handle(\Exception $e)
    {
        // error_log() など
        echo 'PHPエラーが発生しました -- ' . $e->getMessage() . PHP_EOL;

        echo new Response('sorry.', 500);
    }
}

class TestErrorHandlerCommand extends Command
{
    protected function configure()
    {
        $this->setName('sample:error-handler');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // ErrorHandler クラスは、PHPのエラーを検出し、例外に変換してスローします
        ErrorHandler::register();

        YourExceptionHandler::register();

        try {

            $nonObject = null;
            $nonObject->method();

        } catch (\Exception $e) {

            // FatalErrorException はキャッチできません

        }
    }
}

実行結果

$ php app/console sample:error-handler --env=prod
PHPエラーが発生しました -- Error: Call to a member function method() on a non-object
in ...\Command\TestErrorHandlerCommand.php line 39
HTTP/1.0 500 Internal Server Error
Cache-Control: no-cache
Date:          Fri, 24 Oct 2014 14:51:43 GMT

sorry.
$ php app/console sample:error-handler --env=dev
PHPエラーが発生しました -- Error: Call to a member function method() on a non-object
in ...\Command\TestErrorHandlerCommand.php line 39
HTTP/1.0 500 Internal Server Error
Cache-Control: no-cache
Date:          Fri, 24 Oct 2014 14:52:35 GMT

sorry.PHPエラーが発生しました -- Error: Call to a member function method() on a non-object
in ...\Command\TestErrorHandlerCommand.php line 39
HTTP/1.0 500 Internal Server Error
Cache-Control: no-cache
Date:          Fri, 24 Oct 2014 14:52:35 GMT

sorry.