我的目标是保存控制台命令期间发生的异常和错误。
我正在使用console.exception本机symfony事件,注册如下:
kernel.listener.console:
class: Evo\CronBundle\EventListener\ConsoleListener
arguments: [@doctrine.orm.entity_manager]
tags:
- { name: kernel.event_listener, event: console.exception, method: onConsoleException }
我正在运行以下自定义命令:
<?php
namespace Evo\CronBundle\Command;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Evo\CronBundle\Event\CustomConsoleCommandEvent;
use Evo\CronBundle\Event\CustomConsoleTerminateEvent;
use Evo\CronBundle\Event\CustomConsoleExceptionEvent;
use Evo\CronBundle\EvoCronEvents;
class SendPostRegistrationMail1Command extends ContainerAwareCommand
{
/**
* Configure command
*/
protected function configure()
{
$this->setName('evo:send_post_registration_mail_1')
->setDescription('Send Post Registration mail #1')
;
}
/**
* Execute command
*
* @param InputInterface $input
* @param OutputInterface $output
* @return int|null|void
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
throw new \Symfony\Component\Debug\Exception\FatalErrorException('test');
}
}
抛出的异常会触发事件,我可以在其中转储我将保存到数据库中的异常:
<?php
namespace Evo\CronBundle\EventListener;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Console\Event\ConsoleExceptionEvent;
use Evo\CronBundle\Entity\CommandException;
class ConsoleListener
{
/**
* @var \Doctrine\ORM\EntityManager
*/
private $em;
/**
* @var \Evo\CronBundle\Entity\CommandExecution
*/
private $commandExecution;
/**
* Constructor
*
* @param EntityManager $em
*/
public function __construct(EntityManager $em)
{
$this->em = $em;
}
/**
* onConsoleException
*
* @param ConsoleExceptionEvent $event
*/
public function onConsoleException(ConsoleExceptionEvent $event)
{
$exception = $event->getException();
echo '<pre>';
\Doctrine\Common\Util\Debug::dump($exception);
echo '</pre>';
die();
}
}
显示
object(stdClass)#548 (6) {
["__CLASS__"]=>
string(53) "Symfony\Component\Debug\Exception\FatalErrorException"
["message"]=>
string(4) "test"
["code"]=>
int(0)
["file"]=>
string(94) "C:\server\www\evoportail-zfony\src\Evo\CronBundle\Command\SendPostRegistrationMail1Command.php"
["line"]=>
int(59)
["severity"]=>
int(1)
}
在这种情况下,异常正确填充了消息,异常类就是我在命令中抛出的异常类。
但是,如果我故意触发一个php致命错误,使Symfony使用Exceptionhandler将其转换为异常,例如:
/**
* Execute command
*
* @param InputInterface $input
* @param OutputInterface $output
* @return int|null|void
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
strpos();
}
我的活动中转储的例外情况如下:
object(stdClass)#642 (6) {
["__CLASS__"]=>
string(48) "Symfony\Component\Debug\Exception\DummyException"
["message"]=>
string(0) ""
["code"]=>
int(0)
["file"]=>
string(98) "C:\server\www\evoportail-zfony\vendor\symfony\symfony\src\Symfony\Component\Debug\ErrorHandler.php"
["line"]=>
int(162)
["severity"]=>
int(1)
}
这是在\ Symfony \ Component \ Debug \ ErrorHandler.php中抛出的DummyException,它与我的命令中触发的错误没有任何关系。我是否错过了有关此ErrorHandler应该将错误转换为异常的内容?