Crear servidor SOAP en PHP

La extensión soap de PHP proporciona clases SoapClient y SoapServer. Podemos usar la clase SoapServer para configurar un servidor de servicio SOAP con o sin un archivo de descripción de servicio WSDL.

Cuando se usa sin WSDL (modo no WSDL), SoapClient y SoapServer utiliza un formato de intercambio común, que elimina la necesidad de un archivo WSDL.

Antes de seguir adelante, debemos asegurarnos de tener instalada la extensión soap. Podemos hacerlo observando el resultado del comando de consola php -m o observando el resultado de la función phpinfo():

Con la extensión soap disponible y cargada, podemos preparar nuestro directorio de proyectos de servicio de soap según la siguiente estructura:

En adelante, asumiremos que el servidor web está configurado para servir contenido desde el directorio de servicio soap-service/server a http://soap-service.server solicitudes y contenido del directorio de servicio soap-service/client a http://soap-service.client peticiones.
Creemos un pequeño servicio SOAP con dos clases diferentes, cada una con el mismo método welcome (). Podemos comenzar creando el archivo soapservice/server/services/Foggyline/Customer.php con el siguiente contenido:

<?php
namespace Foggyline;
class Customer
{
/**
* Says "Welcome customer…"
* @param $name
* return string
*/
function welcome($name)
{
return 'Welcome customer: ' . $name;
}
}

Ahora, creemos el archivo soap-service/server/services/Foggyline/User.php con el siguiente contenido:

<?php
namespace Foggyline;
class User
{
/**
* Says "Welcome user…"
* @param $name
* @return string
*/
function welcome($name)
{
return 'Welcome user: ' . $name;
}
}

Con las dos clases en su lugar, creemos una clase proxy para envolverlas. Lo hacemos creando el archivo soap-service/server/ServiceProxy.php con el siguiente contenido:

<?php
require_once __DIR__ . '/services/Foggyline/Customer.php';
require_once __DIR__ . '/services/Foggyline/User.php';
class ServiceProxy
{
private $customerService;
private $userService;
public function __construct()
{
$this->customerService = new Foggyline\Customer();
$this->userService = new Foggyline\User();
}
/**
* Says "Welcome customer…"
* @soap
* @param $name
* @return string
public function customerWelcome($name)
{
return $this->customerService->welcome($name);
}
/**
* Says "Welcome user…"
* @soap
* @param $name
* return string
*/
public function userWelcome($name)
{
return $this->userService->welcome($name);
}
}

Ahora que tenemos nuestra clase proxy, podemos crear la instancia real de SoapServer. Lo hacemos creando el archivo soap-service/server/index.php con el siguiente contenido:

<?php
require_once __DIR__ . '/ServiceProxy.php';
$options = [
'uri' => 'http://soap-service.server/index.php'
];
$server = new SoapServer(null, $options);
$server->setClass('ServiceProxy');
$server->handle();

Aquí, estamos instanciando la instancia de SoapServer, pasándole null a el parámetro $wsdl y solo una opción ‘uri’ bajo el parámetro $options. El URI debe especificarse en un modo non-wsdl. Luego usamos el método de instancia setClass() para establecer la clase que manejará las solicitudes SOAP entrantes. Desafortunadamente, no podemos pasar una matriz de clases o llamar al método setClass() varias veces para agregar varias clases de manejo diferentes a la vez, razón por la cual creamos la clase ServiceProxy para envolver las clases de Cliente y Usuario. Finalmente, llamamos al método handle() de la instancia de $server, que maneja una solicitud SOAP. En este punto, nuestro servidor de servicio SOAP debe estar completamente operativo.

Comparte