/**
* Classe utilizada para gerenciar a ordem da Chain of Reponsability
*/
class EscritorExcel
{
private $dados;
private $indices;
private $titulos;
private $arquivo;
public function __construct(array $dados, array $indices, array $titulos)
{
$this->dados = $dados;
$this->indices = $indices;
$this->titulos = $titulos;
}
public function setArquivo($arquivo) {
$this->arquivo = $arquivo;
}
public function escrever($formato) {
$escritor = new ExcelResultadoHtmlWriter($this->arquivo, new ExcelCsvWriter($this->arquivo));
$escritor->writeArray($this->dados, $this->indices, $this->titulos, $formato);
}
}
abstract class ExcelWriter
{
protected $arquivo;
public function __construct($arquivo, ExcelWriter $proximo = null)
{
$this->arquivo = $arquivo;
$this->proximo = $proximo;
}
public abstract function writeArray(array $dados, array $indices, array $titulos, $formato);
}
class ExcelCsvWriter extends ExcelWriter
{
public function writeArray(array $dados, array $indices, array $titulos, $formato)
{
if ($formato == 'csv') {
// Formata os $dados, utilizando os $indices o array, e adiciona os $titulos
} else {
$this->proximo->writeArray($dados, $indices, $titulos, $formato);
}
}
}
class ExcelResultadoHtmlWriter extends ExcelWriter
{
public function writeArray(array $dados, array $indices, array $titulos, $formato)
{
if ($formato == 'html') {
// Formata os $dados, utilizando os $indices o array, e adiciona os $titulos
} else {
$this->proximo->writeArray($dados, $indices, $titulos, $formato);
}
}
}
E para utilizar:
$writer = new EscritorExcel($resultados, $indicesDeResultado, $titulos);
$writer->setArquivo($arquivo);
$writer->escrever('html'); // ou $writer->escrever('csv');
Esta implementação é uma Chain of Responsability?