Estou voltando á programação em PHP depois de muitos meses sem fazer muitas coisas. Vou mostrar aqui como ler um RSS (2.0) e gerar um html a partir dele, usando orientação a objetos. Para ajudar na leitura, vale a pena comentar que eu usei o termo Feed para o arquivo XML lido e FeedEntry cada entrada (num RSS, abstraímos isso normalmente para uma notícia ou matéria).
Criei três arquivos:
- uma classe que segue o conceito de JavaBean para armazenar os dados de cada FeedEntry
- uma classe que funcionaria como um service: lê o XML e cria a partir dele uma lista de FeedEntries
- um arquivo PHP que instancia a classe de serviço e gera adequadamente o código html
O código da classe FeedEntry.php
<?php class FeedEntry { private $title; private $description; private $pubDate; private $link; function __construct($title, $description, $pubDate, $link) { $this->title = $title; $this->description = $description; $this->pubDate = date("d-M-Y", strtotime($pubDate)); $this->link = $link; } public function getTitle() { return $this->title; } public function getDescription() { return $this->description; } public function getPubDate() { return $this->pubDate; } public function getLink() { return $this->link; } } ?>
Eis o código da classe de serviço (FeedService.php), devidamente comentado:
<?php require("FeedEntry.php"); class FeedService { private $file; private $xml; private $doc; private $feedEntries = array(); /* construtor: recebe a URL do feed e instancia objeto DOMDocument */ function __construct($feedUrl) { $this->file = $feedUrl; $this->doc = new DOMDocument(); } /** * carrega o arquivo XML do feed * */ private function readXML() { $this->doc->load($this->file); } /** * lê os nós */ private function readNodes() { /** * percorre o objeto do tipo DOMDocument através do método getElementsByTagName() * cria um objeto do tipo FeedEntry e adiciona no array * * cada feed é declarado no RSS com uma tag <item> e tem: * uma tag <title> para o título do feed * uma tag <descritpion> para a descrição do feed * uma tag <pubDate> para a data de publicação do feed * uma tag <link> para o link do feed */ $dataset = $this->doc->getElementsByTagName("item"); foreach($dataset as $feed) { $feedEntry = new FeedEntry($feed->getElementsByTagName("title")->item(0)->nodeValue, $feed->getElementsByTagName("description")->item(0)->nodeValue, $feed->getElementsByTagName("pubDate")->item(0)->nodeValue, $feed->getElementsByTagName("link")->item(0)->nodeValue); array_push($this->feedEntries, $feedEntry); } } /** * chama métodos que lê o XML, percorre os nós transformando-os em objetos FeedEntry e retorna a lista * desses objetos */ public function consume() { $this->readXML(); $this->readNodes(); return $this->feedEntries; } } ?>
E, finalizando, o código da página PHP (chamei de consume.php) que vai consumir esse RSS:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Exemplo - consumo de um RSS</title> </head> <body> <h1>Exemplo de uso da classe FeedService</h1> <dl> <?php //inclui Service que faz a manipulação de Feed require("FeedService.php"); //instancia objeto do tipo $feedService = new FeedService("http://feeds.feedburner.com/AndAfter"); $feedEntries = $feedService->consume(); //método do service retorna um array de objetos FeedEntry foreach($feedEntries as $feedEntry) { //percorre a lista de feeds, retornando a cada iteração objetos do tipo FeedEntry ?> <dt><a href="<?php echo $feedEntry->getLink(); ?>"><?php echo $feedEntry->getTitle() . " (" . $feedEntry->getPubDate() . " )"; ?></a></dt> <dd><?php echo $feedEntry->getDescription(); ?></dd> <?php } ?> </dl> </body> </html>
Tentei separar um pouco as canadas, mas isso nem de perto chega no conceito de MVC. Mas é um começo, já criando um bean e uma classe específica para acessar dados – note que não há mistura no FeedService de marcação html, ou seja, essa classe pode ser utilizada normalmente em qualquer outro projeto.
Para facilitar, coloquei os 3 arquivos para baixar: http://www.chrisb.com.br/files/consumeFeed.zip
É só descompactar no mesmo diretório e acessar, que funcionará.