【问题标题】:Laravel test connection to SOAP WDSL and exception handlingLaravel 测试到 SOAP WSDL 的连接和异常处理
【发布时间】:2014-09-19 13:37:41
【问题描述】:

我使用 laravel 框架,我想检查与 Soap 服务器的连接是否成功,而应用程序不会因致命错误而死。

这两个:

$this->client = @new SoapClient("http://some.url/test.wsdl");
                $this->session = $this->client->login("username", "password");
                if (is_soap_fault($this->session)) {
                   return "Error";
                }

还有这个:

try {
 $this->client = @new SoapClient("http://some.url/test.wsdl");
 $this->session = $this->client->login("username", "password");
} catch (SoapFault $e) {
    return "Error";
}

导致致命错误:

Symfony \ Component \ Debug \ Exception \ FatalErrorException

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

谢谢

【问题讨论】:

    标签: php exception soap laravel


    【解决方案1】:

    我今天也遇到了这个问题。问题是 Laravel 错误处理程序将这个可捕获的错误解释为致命错误,并因此中止程序。

    为了解决这个问题,你需要在 Laravel 的内部错误处理程序之前拦截错误。此方法因您的 Laravel 版本而异:

    Laravel 4.*

    1. 转到您的globals.php 文件。这应该在您的 app\start\ 文件夹中。
    2. 添加以下代码(Thanks dmgfjaved):

      App::fatal(function($exception)
      {   //If SOAP Error is found, we don't want to FATALLY crash but catch it instead
         if(strpos($exception->getMessage(), 'SOAP-ERROR') !== FALSE)
         {
           return '';
         }
      });
      

    Laravel 5.*

    1. 没有globals.php 文件。所有 IoC 调用都通过ServiceProviders 处理。转至app\Providers\AppServiceProvider.php
    2. 找到render() 函数。
    3. return parent::render($request, $e);前添加如下代码

      if(strpos($e->getMessage(), 'SOAP-ERROR') !== false)
      {
          return false;
      }
      

    这将从您的错误处理程序中删除 SoapFault 错误类型。记住要捕获 SoapFault,因为 Laravel 不会!

    【讨论】:

      【解决方案2】:

      试试这个:

      try {
       $this->client = @new SoapClient("http://some.url/test.wsdl");
       $this->session = $this->client->login("username", "password");
      } catch (\Throwable $e) {
          return "Error";
      }
      

      【讨论】:

        【解决方案3】:

        解决方案是实际要求 Soap 客户端抛出 SoapFault 而不是报告 E_ERROR。

        当 Soap 客户端报告 E_ERROR 时,您将无法捕获任何内容。

        要修复这个初始化你 SoapClient 像这样:

        $clientOptions = array(
            'exceptions' => true,
        );
        
        try {
            $client = new \SoapClient("foo.wsdl", $clientOptions);
        } catch (\SoapFault $e) {
            // Do what you need to do!;
        }
        
        try {
            $result = $client->__soapCall($method, $data);
        } catch (\SoapFault $e) {
            // Do what you need to do!;
        }
        

        【讨论】:

          【解决方案4】:

          这就是我在 Laravel 5.1 中使用肥皂的方式

          1. 全新安装 laravel 5.1

          2. 安装artisaninweb/laravel-soap

          3. 创建一个控制器SoapController.php

            <?php
            namespace App\Http\Controllers;
            use Artisaninweb\SoapWrapper\Facades\SoapWrapper;
            class SoapController extends Controller {
            
            public function demo()
            {
                // Add a new service to the wrapper
                SoapWrapper::add(function ($service) {
                    $service
                        ->name('currency')
                        ->wsdl('http://currencyconverter.kowabunga.net/converter.asmx?WSDL')
                        ->trace(true);
                });
            
                $data = [
                    'CurrencyFrom' => 'USD',
                    'CurrencyTo'   => 'EUR',
                    'RateDate'     => '2014-06-05',
                    'Amount'       => '1000'
                ];
            
                // Using the added service
                SoapWrapper::service('currency', function ($service) use ($data) {
                    var_dump($service->getFunctions());
                    var_dump($service->call('GetConversionAmount', [$data])->GetConversionAmountResult);
                });
            }
            
            }
            
          4. 在你的 routes.php 中创建一个路由

            Route::get('/demo', ['as' =&gt; 'demo', 'uses' =&gt; 'SoapController@demo']);

          【讨论】:

            【解决方案5】:

            @Adam Link 提供了一个很好的提示,但在 Laravel 5.1 中,AppServiceProvider 中似乎不再存在渲染方法。

            相反,它已移至 app\Exceptions\Handler.php

            【讨论】:

              猜你喜欢
              • 2017-09-14
              • 2018-11-12
              • 2019-06-22
              • 1970-01-01
              • 2023-03-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多