1

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

我创建了一个从控制器调用的服务,它工作正常。现在我需要该服务生成日志,并且我正在尝试以这种方式传递记录器:

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 不存在),应用程序会挂起。

我做错什么了吗?非常感谢。

4

2 回答 2

0

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

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

于 2013-01-17T17:44:49.563 回答
0

抱歉,问题不在记录器上,而是在以下行中:

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

如果我删除这些行并只记录异常消息,一切正常。如果未找到 WSDL,SoapClient 会生成异常:

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

解决并修复。很抱歉垃圾邮件。

于 2013-01-17T17:52:36.437 回答