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

XML retorna apenas o ultimo curso #2

Olá,

Estou tendo o mesmo problema deste Tópico, mas não consegui entender a solução: "A cada iteração do loop você tá sobrescrevendo a variável $cursosEmXml. Por isso só exibe o último. "

public function handle(ServerRequestInterface $request): ResponseInterface
    {
        /** @var Curso[] $cursos */
        $cursos = $this->repositorioDeCursos->findAll();
        $cursosEmXML = new \SimpleXMLElement('<cursos/>');

        foreach ($cursos as $curso){
            $cursosEmXML = $cursosEmXML->addChild('curso');
            $cursosEmXML->addChild('id', $curso->getId());
            $cursosEmXML->addChild('descricao', $curso->getDescricao());

        }

        return new Response(200, ['Content-Type' => 'application/xml'],$cursosEmXML->asXML());
    }

Consegue me orientar? Abraços,

Luis Felipe Ribeiro

2 respostas
solução!

Fala, Luis.

Você cria uma variável $cursosEmXml que é um elemento XML representando todos os cursos, ou seja, a tag principal <cursos />.

Até aí, beleza.

Mas, a cada iteração do foreach, ou seja, pra cada um dos cursos, você apaga o valor da variável $cursosEmXml, colocando nela apenas o conteúdo do curso atual que está passando pelo foreach.

Nessa linha: $cursosEmXML = $cursosEmXML->addChild('curso'); você está sobrescrevendo o valor da variável $cursosEmXml.

O que eu fiz no treinamento, foi:

...
// Elemento que vai ter todos os cursos: Plural ($cursosEmXml)
$cursosEmXML = new \SimpleXMLElement('<cursos/>');

foreach ($cursos as $curso) {
    // Adicionando aos cursos, o curso atual.
    // addChild retorna o novo elemento que foi adicionado
    // então eu crio a nova variável $cursoEmXml com esse conteúdo
    $cursoEmXML = $cursosEmXML->addChild('curso');
    $cursoEmXML->addChild('id', $curso->getId());
    $cursoEmXML->addChild('descricao', $curso->getDescricao());
}
...

Obrigado, agora entendi a confusão entre as duas variáveis.

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