Per realizzare il nostro server utilizzeremo la classe SoapServer
inclusa nell'estensione php-soap
. La classe prende in ingresso il path del file WSDL ed un array di opzioni.
Prima di iniziare aggiungiamo però qualche riga di codice necessaria al funzionamento del nostro esempio. Dato che siamo in un ambiente di sviluppo disabilitiamo la cache WSDL per evitare problemi e definiamo una classe Book
necessaria per lo scambio di dati tra client e server:
//server.php
ini_set("soap.wsdl_cache_enabled","0");
class Book
{
public $name;
public $year;
}
A questo punto siamo pronti per creare il nostro server:
$server = new SoapServer("books.wsdl", [
'classmap' => [
'book' => 'Book',
]
]);
$server->addFunction('getBook');
$server->handle();
I parametri del costruttore sono, come già anticipato, i seguenti:
- il path del file WSDL;
- un array di opzioni. Nel nostro caso abbiamo passato un ulteriore array chiamato
classmap
che ci consente di mappare i tipi complessi definiti nel file WSDL direttamente sulle nostre classi PHP. In questo caso il tipobook
definito neitypes
sarà mappato sulla nostra classeBook
già definita.
Una volta istanziata la classe andremo ad esporre le funzioni che vogliamo utilizzare - in questo caso getBook
- e poi a richiamare il metodo handle()
che si occuperà di processare la richiesta che arriva dal client.
Non resta che definire la funzione getBook
che riceverà in ingresso un intero e restituirà al client un oggetto di tipo Book
:
function getBook($bookId)
{
//simulazione di una ricerca. In un caso reale probabilmente faremo
//una query sul database per restituire l'oggetto
$book = new Book();
$book->name = 'The Lord of the Rings';
$book->year = 2017;
return $book;
}
Il codice completo del file è il seguente:
<?php
ini_set("soap.wsdl_cache_enabled","0");
class Book
{
public $name;
public $year;
}
$server=new SoapServer("books.wsdl",[
'classmap'=>[
'book'=>'Book',
]
]);
$server->addFunction('getBook');
$server->handle();
function getBook($bookId)
{
//simulazione di una ricerca. In un caso reale probabilmente faremo
//una query sul database per restituire l'oggetto
$book = new Book();
$book->name = 'The Lord of the Rings';
$book->year = 2017;
return $book;
}