Я использую структуру 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:
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 ''; } });
Laravel 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-soap
создать контроллер 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']);
@Adam Link предоставил хороший подсказку, но в Laravel 5.1 появилось stha tthere больше не метод рендеринга в AppServiceProvider.
Вместо этого он был перенесен в приложение \ Exceptions \ Handler.php