2016-05-24 6 views
2

Ich versuche, einen Seifenserver in Laravel 5.2 zu erstellen. Dies ist mein Code:
Inhalt von SoapController.php:Soap-Server funktioniert nicht in Laravel 5.2

<?php namespace Giant\Http\Controllers; 

class SoapController extends Controller { 

    public function __construct() { 
     parent::__construct(); 
     ini_set('soap.wsdl_cache_enabled', 0); 
     ini_set('soap.wsdl_cache_ttl', 0); 
     ini_set('default_socket_timeout', 300); 
     ini_set('max_execution_time', 0); 
    } 

    public function server() { 
     $location = url('server'); // http://payment.dev/server 
     $namespace = $location; 
     $class = "\\Giant\\Http\\Controllers\\HelloWorld"; 

     $wsdl = new \WSDL\WSDLCreator($class, $location); 
     $wsdl->setNamespace($namespace); 

     if (isset($_GET['wsdl'])) { 
      $wsdl->renderWSDL(); 
      exit; 
     } 

     $wsdl->renderWSDLService(); 

     $wsdlUrl = url('wsdl/server.wsdl'); 
     $server = new \SoapServer(
      url('server?wsdl'), 
      array(
       'exceptions' => 1, 
       'trace' => 1, 
      ) 
     ); 

     $server->setClass($class); 
     $server->handle(); 
     exit; 
    } 

    public function client() { 
     $wsdl = url('server?wsdl'); 
     $client = new \SoapClient($wsdl); 

     try { 
      $res = $client->hello('world'); 
      dd($res); 
     } catch (\Exception $ex) { 
      dd($ex); 
     } 
    } 
} 


class HelloWorld { 
    /** 
    * @WebMethod 
    * @desc Hello Web-Service 
    * @param string $name 
    * @return string $helloMessage 
    */ 
    public function hello($name) { 
     return "hello {$name}"; 
    } 
} 

Meine WSDL-Datei ist: wsdl

Und mein routes:

Route::any('/server', '[email protected]'); 
Route::any('/client', '[email protected]'); 

Und das Ergebnis ich:

Internal Server Error 

:(
Ich verwende piotrooo/wsdl-creator, um WSDL zu generieren. (Es gibt kein Problem damit, es funktioniert in Laravel 4.2). Und ich habe auch nusoap und php2wsdl Bibliotheken ausprobiert.
Mein SoapClient funktioniert gut. Weil es Service von anderen Soap-Servern in anderen URLs erhalten kann, aber ich denke, dass mein SoapServer nicht gut funktionieren kann.
Ich bekomme sogar keine Fehler in der Fehlerprotokolldatei.

+0

ist dies ein Tippfehler oder ein kleiner Fehler, den Sie nicht gesehen haben, der dazu führt, dass das Skript fehlschlägt? 'Array ( 'Ausnahmen' => 1, 'trace' => 1, )' sollte 'Array ( 'Ausnahmen' => 1, 'trace' => 1 )'. Wenn Sie deshalb einen Fehler erhalten, sollte ich diesen Kommentar in eine Antwort umwandeln. –

Antwort

2

Ich habe gerade herausgefunden, was das Problem war:
Das Problem mit dem Protokoll war, dass ich Fehler-Protokoll in meinem www-Ordner überprüft, während Laravel seine eigene Protokolldatei hat. Und ich dachte, dass ich ein Problem mit TokenMismatchException habe. Laravels CsrfVerifyMiddleware ließ mich nicht mit Seife bitten.
Ich habe gerade meine URL zu "außer" Array in CsrfVerifyMiddleware Datei hinzugefügt.

+1

ooh, yeah, ich habe vergessen, erzähle davon, sorry, die Route muss in der Exception-Liste sein – Faradox

+1

Die Soap-Aufrufe sind in der Regel API-Aufrufe, also benutze die routes/route-Datei api.php. Die api-Middleware ist zustandslos und verwendet keinen CSRF-Schutz. https://laravel.com/docs/5.4/routing#basic-routing –

1

Verwenden Sie nicht zwei Klassen in einer Datei Dies ist meine Erfahrung aus unserem Projekt, in dem verwendete Soap Dies ist SoapServerController. Fügen Sie WSDL-Datei in Stammordner Ihres Projekts

class SoapServerController extends Controller { public function service() { $server = new \SoapServer('http://' . request()->server('HTTP_HOST') . '/yourwsdlfile.wsdl'); $server->setClass('App\Http\Requests\somenamespace\SoapRequest'); $server->handle(); } }

und in Anfragen erstellen Klasse für Anfragen wie folgt aus:

class SoapRequest{ public function functionFromWsdl($args if you want) { $parameters = (array) $args; return with(new fooClass())->barMethod($parameters); } }

und Strecke Post sein muss:

Route::post('webservice','[email protected]');

+0

Danke @Faradox. Aber das hat mir nicht geholfen. Das ist mein [Controller] (http://pastebin.com/V1STP9xF), mein [wsdl] (http://pastebin.com/Cix5EaS6), meine [SoapRequest-Klasse] (http://pastebin.com/8HY0C7sf) , mein [SoapClinet] (http://pastebin.com/Ckp80xAW) (in einem reinen PHP-Skript). und meine Route: '' 'Route :: any ('webservice', 'SoapServerController @ service');' ' –

+0

welche Art von Fehler – Faradox

+0

Ich bekomme" Interner Server Fehler ", wenn ich Methode in Soap-Server aufrufen. Und es gibt keine Log-in error_log Datei und ich weiß nicht, was die Ursache des Fehlers ist. –

1

In Laravel 5 sind alle vorherigen Aussagen zu Middleware geworden (genau wie im Django-Framework). Und Sie müssen mit Middlewares implementieren.

+0

Ich überprüfte die Laravel 5 Dokumente. Du hast Recht @Sirbito. Danke vielmals. –

Verwandte Themen