Symfony2:在服务中使用记录器的问题(作为参数传递)

时间:2013-01-17 17:36:33

标签: symfony monolog

我正在使用Symfony 2.1开发一个项目。

我创建了一个从控制器调用的服务,它运行正常。 现在我需要服务生成日志,我正试图以这种方式传递logger:

soap.client:
    class: MyFirm\MyAppBundle\Service\SOAPClient
        arguments: 
            logger: "@logger"

我的服务是这样定义的:

namespace MyFirm\MyAppBundle\Service;

use \SoapClient as SoapClient;

use Monolog\Logger;

class SOAPClient
{
    private $logger;

    function __construct (Logger $logger)
    {
        $this->logger = $logger;
    }

    function sendMessage ($message, $wsdl_url) 
    {
        $webServResult = "ERROR";

        try{
            $client = new SoapClient($wsdl_url, array("trace"=>true,
                    "exceptions"=>true));        
            $webServResult=$client->sendMessage($data);
        }
        catch(\Exception $ex){
            $webServResult="ERROR";
            $message=$ex->getMessage();
            $log_text = print_r($ex, true)."\n".
                    $client->__getLastRequest()."\n".
                    $client->__getLastResponse();
            $this->logger->err("ERROR: ".$log_text);            
        }               

        return $webServResult;
    }


}

但是,当我使用记录器时(例如,如果wsdl不存在),应用程序将挂起。

我做错了吗?非常感谢。

2 个答案:

答案 0 :(得分:0)

这不是来自记录器的问题,而是来自SoapClient,如果无法访问WSDL,它不会抛出任何异常......它等待直到抛出致命错误...

在调用SoapClient之前,你必须检查WSDl是否存在;)

答案 1 :(得分:0)

对不起,问题不在于记录器,而在于行:

  $log_text = print_r($ex, true)."\n".
                $client->__getLastRequest()."\n".
                $client->__getLastResponse();

如果删除这些行并仅记录Exception消息,则一切顺利。 如果找不到WSDL,SoapClient会生成异常:

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://localhost/unknown.wsdl' : 
             failed to load external entity "http://localhost/unknown.wsdl"

解决并修复。对不起垃圾邮件。