Come posso creare un client per un servizio senza nascondere i parametri necessari per ciascun endpoint?

1

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 file wsdl e imposta su di esso le opzioni necessarie, quindi lo restituisce.
  • Avere più Request oggetti, preferibilmente implementando l'interfaccia Request , che prende come argomento costruttore il Client 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?

    
posta Parham Doustdar 28.12.2015 - 10:21
fonte

1 risposta

1

Prenderò in considerazione lo spostamento dei parametri nella __construct () in modo che ogni richiesta faccia una sola cosa.

Vorrei anche prendere in considerazione la possibilità di escludere i parametri usando valueobject.

Qualcosa del genere:

class LockSeatRequest implements RequestInterface
{

    public function __construct(Client $client, LockSeatRequestValueObject $params)
    {
        $this->client = $client;
        $this->params = $params;
    }

    public function execute()
    {
        $result = $this->client->lockSeat($this->params->getId(), $this->params->getCount(), $this->params->getDate());

        // Make some changes to $result here...

        return $result;
    }

}

interface Request
{

    public function execute();
}

class LockSeatRequestValueObject
{
    private $id;
    ....

    public function __construct ($id, $count, $date)
    // or in php7
    // public function __construct (int $id, int $count, \DateTime $date)
    {
        $this->id = $id;
        $this->validate(); // Might be redundant in php7
    }

    public function getId()
    {
        return $this->id;
    }
    ......
}
    
risposta data 30.12.2015 - 10:12
fonte

Leggi altre domande sui tag