Тестовое соединение Laravel с SOAP WDSL и обработка исключений

Я использую инфраструктуру 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"

Спасибо

0

Решение

Я боролся с этой проблемой и сегодня. Проблема в том, что обработчик ошибок Laravel интерпретирует эту подхватывающую ошибку как фатальную ошибку и в результате прерывает работу программы.

Чтобы противостоять этому, вам нужно перехватить ошибку до внутреннего обработчика ошибок Laravel. Этот метод зависит от вашей версии Laravel:

Ларавел 4. *

  1. Перейти к вашей globals.php файл. Это должно быть в вашем app\start\ папка.
  2. Добавьте следующий код (Спасибо 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 '';
    }
    });
    

Ларавел 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 не будет!

3

Другие решения

Вот как я получил мыло для работы в Laravel 5.1

  1. чистая установка laravel 5.1

  2. устанавливать artisaninweb / Laravel-мыло

  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. Создайте маршрут в вашем маршруте.

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

1

Попробуй это:

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

Решение состоит в том, чтобы на самом деле попросить клиента 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!;
}
1

@ Adam Link предоставил хорошую подсказку, но в Laravel 5.1 кажется, что в AppServiceProvider больше нет метода рендеринга.

Вместо этого он был перемещен в app \ Exceptions \ Handler.php

0
По вопросам рекламы [email protected]