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.