Mais um exemplo do padrão de projeto Fluent Interface

Olá pessoal, esse é meu primeiro post oficial e gostaria de falar de um assunto que chamou minha atenção enquanto participava de webcast sobre Zend Framework. Acabei por aprender que vários componentes do zf utilizam o padrão de projeto Fluent Interface, e fiquei curioso para entender na prática como construir uma classe seguindo esse pattern. Fiz algumas buscas na internet e descobri que esse é um padrão muito simples e que o pulo do gato está no retorno dos métodos, que devem retornar $this. Tem vários artigos na internet falando sobre o assunto, mas gostaria de deixar mais um exemplo.

<?php

/**
* Description of DbConf
*
* DbConf é um padrão FluentInterface
*
* Uma classe desenvolvida seguindo esse padrão permite uma chamada de métodos
* ENCADEADA, i.é., sem a necessidade de ficar rescrevendo o nome do objeto
* e posteriormente chamar o método.
*
* Exemplo sem FluentInterface
* $dsn = new DbConf;
* $dsn->setHost('');
* $dsn->setPort('');
* $dsn->...('');
*
* Exemplo com FluentInterface
* $dsn = new DbConf;
* $dsn->setHost('localhost')->setPort('3306')->setDbName('database');
*
* @author dos Santos, Anderson Henrique
*/
class DbConf {

/** @var string */
private $_host = ''; // localhost

/** @var string */
private $_port = ''; // 127.0.0.1

/** @var string */
private $_dbname = ''; // database

/** @var string */
private $_username = ''; // root;

/** @var string */
private $_passwd = ''; // root;

public function setHost($host) {
$this->_host = $host;
return $this;
}

public function setPort($port) {
$this->_port = $port;
return $this;
}

public function setDbName($dbname) {
$this->_dbname = $dbname;
return $this;
}

public function setUsername($username) {
$this->_username = $username;
return $this;
}

public function setPasswd($passwd) {
$this->_passwd = $passwd;
return $this;
}

public function getDSN($driver) {

switch ($driver) {
case 'mysql':
if ($this->_port == '')
return "mysql:host={$this->_host};dbname={$this->_dbname}";
else
return "mysql:host={$this->_host};dbname={$this->_dbname};port={$this->_port}";

case 'postgre':
if ($this->_port == '')
return "pgsql:host={$this->_host};dbname={$this->_dbname}";
else
return "pgsql:host={$this->_host};dbname={$this->_dbname};port={$this->_port}";

default :
return 'Nenhum driver foi informado.';
}
}
}

Está aí, espero que gostem!

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>