Я использую инфраструктуру 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"
Спасибо
Я боролся с этой проблемой и сегодня. Проблема в том, что обработчик ошибок Laravel интерпретирует эту подхватывающую ошибку как фатальную ошибку и в результате прерывает работу программы.
Чтобы противостоять этому, вам нужно перехватить ошибку до внутреннего обработчика ошибок Laravel. Этот метод зависит от вашей версии Laravel:
Ларавел 4. *
globals.php
файл. Это должно быть в вашем app\start\
папка.Добавьте следующий код (Спасибо 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. *
globals.php
файл. Все вызовы IoC обрабатываются через ServiceProviders
, Идти к app\Providers\AppServiceProvider.php
,render()
функция.Добавьте следующий код перед return parent::render($request, $e);
if(strpos($e->getMessage(), 'SOAP-ERROR') !== false)
{
return false;
}
Это удалит тип ошибки SoapFault из вашего обработчика ошибок. Не забудьте поймать SoapFault, как Laravel не будет!
Вот как я получил мыло для работы в Laravel 5.1
чистая установка laravel 5.1
устанавливать artisaninweb / Laravel-мыло
создать контроллер 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);
});
}
}
Создайте маршрут в вашем маршруте.
Route::get('/demo', ['as' => 'demo', 'uses' => 'SoapController@demo']);
Попробуй это:
try {
$this->client = @new SoapClient("http://some.url/test.wsdl");
$this->session = $this->client->login("username", "password");
} catch (\Throwable $e) {
return "Error";
}
Решение состоит в том, чтобы на самом деле попросить клиента 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!;
}
@ Adam Link предоставил хорошую подсказку, но в Laravel 5.1 кажется, что в AppServiceProvider больше нет метода рендеринга.
Вместо этого он был перемещен в app \ Exceptions \ Handler.php