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á.