Sto creando un client per un servizio web soap di terze parti nella mia applicazione. Ecco come sto pensando di farlo:
- Crea un
ClientFactory
che rende un client basato sul filewsdl
e imposta su di esso le opzioni necessarie, quindi lo restituisce. - Avere più
Request
oggetti, preferibilmente implementando l'interfacciaRequest
, che prende come argomento costruttore ilClient
e poi effettua richieste al servizio web attraverso quel client.
Ecco un breve esempio per illustrare il mio punto.
class ClientFactory
{
public function create()
{
return new \SoapClient('http://www.example.com/example.wsdl', [
'trace' => true
]);
}
}
class LockSeatRequest implements RequestInterface
{
public function __construct(Client $client)
{
$this->client = $client;
}
public function execute($id, $count, $date)
{
$result = $this->client->lockSeat($id, $count, $date);
// Make some changes to $result here...
return $result;
}
}
interface Request
{
// what should I put in here?
}
Esempio di codice cliente:
$client = $clientFactory->create();
$lockSeatRequest = new lockSeatRequest($client);
$lockSeatRequest->execute(1, 5, '2015-04-04');
Il mio problema qui è che il numero di argomenti e il tipo di argomenti sono diversi dalla richiesta alla richiesta e ciò rende impossibile definire un'interfaccia. Il modo in cui l'ho visto in altre librerie PHP è accettare un array di parametri, ma il mio problema con questo approccio è che rende l'utente necessario cercare i parametri per ogni chiamata di funzione invece di renderlo esplicito. Inoltre, dovrei aggiungere cruft come controllare se le chiavi giuste sono definite nell'array, a ogni Request
, invece di avere la lingua assicurati che ogni parametro con il tipo giusto sia passato alla funzione.
Come posso avere più metodi, ognuno dei quali richiede un numero diverso di argomenti, ma ha ancora implementare una particolare interfaccia?
Oppure, sto vedendo questo totalmente sbagliato?