0
respostas

Solução para a classe de CursosEmXml

Bom dia!

O Vinicius disse que uma solução comum seria criar uma nova classe para a questão dos cursos em XML e não implementar diretamente no controller, acredito eu que por questões como S - SOLID e também por questões de legibilidade e fácil manutenção posteriormente. Com isso decidi criar minha própria solução e ver se ela realmente seria válida numa aplicação real ou seria descartada por algum problema..

A solução foi a seguinte criei uma pasta chamada Service (Acho que deveria ficar em Helper , mas como o foco não é arquitetura eu deixei passar só pra implementar a solução).

Com isso criei uma interface ConversorDeFormatoCurso que tem um método converterFormatoCurso

<?php

namespace Alura\Cursos\Service\ConversorDeFormatoDeCursos;

interface ConversorDeFormatoCurso
{
    public function converterFormatoCurso(): string;
}

Depois criei duas classes ConversorDeCursosPraXml e ConversorDeCursosPraJson que implementam esta interface e assinam o contrato do método

<?php

namespace Alura\Cursos\Service\ConversorDeFormatoDeCursos;

class ConversorDeCursosPraJson implements ConversorDeFormatoCurso
{
    private $cursos;

    public function __construct(array $cursos)
    {
        $this->cursos = $cursos;
        return $this;
    }

    public function converterFormatoCurso(): string
    {
        return json_encode($this->cursos);
    }
}
<?php

namespace Alura\Cursos\Service\ConversorDeFormatoDeCursos;

class ConversorDeCursosPraXml implements ConversorDeFormatoCurso
{
    private $cursos;

    public function __construct(array $cursos)
    {
        $this->cursos = $cursos;
        return $this;
    }

    public function converterFormatoCurso(): string
    {
        $cursosEmXml = new \SimpleXMLElement('<cursos/>');

        foreach ($this->cursos as $curso){
            $cursoEmXml = $cursosEmXml->addChild('curso');
            $cursoEmXml->addChild('id', $curso->getId());
            $cursoEmXml->addChild('descricao', $curso->getDescricao());
        }

        return $cursosEmXml->asXML();
    }
}

Como os construtores se repetem e elas fazem sempre menção a um array de cursos eu poderia jogar o construtor numa classe abstrata e utilizar herança etc... mas enfim... a solução foi essa pra extrair esses comportamentos do controller... acredito até que deva ter sido um exagero utilizar uma classe só pra usar o json_encode que foi o caso do primeiro exemplo.

Com isso gostaria de saber o que os amigos acham sobre essa implementação e que utilidade ela teria num cenário real.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software