Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Padrão para quando uma ação depende de outra

Tenho um caso onde um controller simplesmente chama 6 métodos de uma classe que faz ligação com um WebService externo. Esses seis passos são dependentes uns dos outros (o passo 2 depende do 1, e assim vai...). Para essa dependência ser satisfeita, coloquei as 6 chamadas dentro de um bloco try - catch, e na classe que implementa o WebService, se o código retornado for de erro, lanço uma exceção.

Não sei se ficou claro o cenário, mas, existe algum padrão que torne essa solução mais elegante?

4 respostas

Olá Carlos,

Se esses 6 passos são sempre dependentes no seu sistema, então faz sentido você agrupar as chamadas desses métodos em apenas 1 para seu Controller usar.

Assim, seu Controller poderá chamar:

...
ClasseLigadaAoWS.processoDeSeisPassos(atr1, atr2..);
...

Você pode usar um observer ou chain of Responsibility

Lucas, as chamadas para os seis passos estão em um método no controller

public function processaPedido()
    {
        try {
            $this->primeiroPasso();
            $this->segundoPasso();
            $this->terceiroPasso();
            $this->quartoPasso();
            $this->quintoPasso();

            $resposta = $this->sextoPasso();

            $ficha = $this->montaFichaCadastral($resposta);
            foreach ($this->observers as $observer) {
                $observer->processa($ficha);
            }

            return $resposta->numeroStatusProposta;
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

Onde os método de primeiro a sextoPasso processam o $_POST e fazem a chamada pro método na classe do WebService.

Alan, Observer seria pra executar algo após um "evento". Não é o caso. Eu até tenho observers no meu controller. E, na Chain of Responsability uma classe lida com a requisição, dentre uma lista de classes que poderiam. Também não é o caso, pois só tenho uma classe com seis métodos, entende?

solução!

Você pode fazer o seguinte. Remove esses métodos do controller e faça uma class onde ate o método 5 ele retorne o this e o ultimo método te entregue a resposta ou você pode fazer da forma que o Lucas sugeriu.