Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ronaldoalmeida

myframework

Recommended Posts

Ola pessoal!

Estou estou estudando MVC+OOP+Table Data Gateware e estou precisando entender como funciona. Até no presente momento só conhece de forma procedural. Gostaria de ajuda na montagem de um mini-framwork.

 

Caso tem alguém interessado favor me contactar neste.

 

Obrigado gente!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostaria de saber se crie um Model de conexão correta de leitura.

 

[code]
<?php
/**
 * Classe gerencia cominicação com Base de Dados.
 * Autor = Ronaldo P. Almeida (nonotv@hotmail.com)
 * @packege framework.
 */	
class Model extends PDO{

	# atributos / objetos usando no CRUD. 
	public $_db;
	public $_tabela;
	public $campos;
	public $valores;
	public $where;
	public $limit;
	public $asc;
	public $desc;
	public $data;

	# atributos / objeto para função de tabelas. 
	public $tabela1;
	public $tabela2;
	public $campo;
	public $like;

	# atributos ; obejto de conexão.
	private $connect;
	private $root;
	private $pass;
	private static $conn;

	/*
	 * Função DAO: DATA ACCESS OBJECTS
	 * @Paramentos: Construtor da classe.  
	 */
	function DAO($connect, $root = '', $pass = '') {
               parent::__construct($connect, $root, $pass);
       }

	/*
	 * Métedo de comunicação com base de dados
	 * @ capturar, verificar e tratar a string de conexão. 
	 */
	public static function getDAO(){
		// verifica se referencia da variável existe
		if(!isset(self::$conn)){
			// tratar string de conexão.
			try{
				// refernciar string da comunicação do base de dados.
				self::$conn = new DAO("mysql:host=localhost,dbname=atacaforte", "root", "");
				// 
			} catch(PDOException $e){
				throw new Exception("Erro ao conectar: ".$e->getMessage(). "Código: ".$e->getCode());	
			}

		}
		return self::$conn;
	}

	/*
	 * Médoto PDO: PHP DADOS OBJECTS
	 * Tratamento 
	 */
	 public static function PDO($sql){

		 try{
			 self::$conn = DAO::getDAO();
			 $stm = self::$conn->prepare($sql);
			 $stm->execute();
			 $result = $stm->fetchAll(PDO::FETCH_ASSOC);

			 if(!empty($result)){
				 return $result;
			}else{
				return array();
			}
		}catch(PDOException $e){
			echo "Erro de exceção: ".$e->getMessage(). "Código: ".$e->getCode();
		}
	}

	/*
	 * Funcao que altera o valor da propriedade id.
	 * @param strong $id número identificador.
	 * @Return void.
	 */
	 public function setId($id){
		 $this->id = $id;
	}

	/*
	 * Função que mostra a 
	 */
	public function getId($id){
		return $this->id;
	}

	/*
	 * Método READ: Leituras dos base de dados
	 */
	public function read($where = null, $limit = null, $offset = null, $orderby = null){						               
           $where	= ($where	!= null ? "WHERE {$where}"		: "" );
		$limit  = ($limit	!= null ? "LIMIT {$limit}"		: "" );
		$offset = ($offset	!= null ? "OFFSET{$offset}"		: "" );
		$orderby= ($orderby	!= null ? "ORDER BY{$orderby}"	: "" );
		$date	= ($data	!= null ? ", DATE_FORMAT({$this->data}, '%d/%m/%Y') AS data" : "");

		$sql = $this->connect->query("SELECT {$this->$campos} {$date} FROM `{%this->_tabela}` {$where} {$limit} {$orderby} {$offset}");

               return self::PDO($sql); 
	}
}
?>

[/code]

 

Se pode me ajudar a montar os restante....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ahn? Model estendendo PDO?

Errado... Leia:

http://pt.wikipedia.org/wiki/Princ%C3%ADpio_da_substitui%C3%A7%C3%A3o_de_Liskov

 

PDO é para conexão com banco de dados.

Model cuida da lógica da sua aplicação, que coincidentemente utiliza banco de dados como armazenamento, mas poderia ser um XML, arquivos texto, etc...

 

Nesse caso, não cabe herança, e sim, composição, pois Model NÃO É UM PDO, o Model TEM UM PDO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

\o

 

Se não me engano, esse código é meu. hAEUAEHuEAhea

Lembro que postei aqui. Na verdade, foi o segundo que criei tentando aprender OOP! (e ainda continuo tentando..).

 

Vi que fez modificações, passando parametros no método e tal, fico bacana!

 

Gostaria de saber se crie um Model de conexão correta de leitura.

 

[code]
<?php
/**
 * Classe gerencia cominicação com Base de Dados.
 * Autor = Ronaldo P. Almeida (nonotv@hotmail.com)
 * @packege framework.
 */	
class Model extends PDO{

	# atributos / objetos usando no CRUD. 
	public $_db;
	public $_tabela;
	public $campos;
	public $valores;
	public $where;
	public $limit;
	public $asc;
	public $desc;
	public $data;

	# atributos / objeto para função de tabelas. 
	public $tabela1;
	public $tabela2;
	public $campo;
	public $like;

	# atributos ; obejto de conexão.
	private $connect;
	private $root;
	private $pass;
	private static $conn;

	/*
	 * Função DAO: DATA ACCESS OBJECTS
	 * @Paramentos: Construtor da classe.  
	 */
	function DAO($connect, $root = '', $pass = '') {
               parent::__construct($connect, $root, $pass);
       }

	/*
	 * Métedo de comunicação com base de dados
	 * @ capturar, verificar e tratar a string de conexão. 
	 */
	public static function getDAO(){
		// verifica se referencia da variável existe
		if(!isset(self::$conn)){
			// tratar string de conexão.
			try{
				// refernciar string da comunicação do base de dados.
				self::$conn = new DAO("mysql:host=localhost,dbname=atacaforte", "root", "");
				// 
			} catch(PDOException $e){
				throw new Exception("Erro ao conectar: ".$e->getMessage(). "Código: ".$e->getCode());	
			}

		}
		return self::$conn;
	}

	/*
	 * Médoto PDO: PHP DADOS OBJECTS
	 * Tratamento 
	 */
	 public static function PDO($sql){

		 try{
			 self::$conn = DAO::getDAO();
			 $stm = self::$conn->prepare($sql);
			 $stm->execute();
			 $result = $stm->fetchAll(PDO::FETCH_ASSOC);

			 if(!empty($result)){
				 return $result;
			}else{
				return array();
			}
		}catch(PDOException $e){
			echo "Erro de exceção: ".$e->getMessage(). "Código: ".$e->getCode();
		}
	}

	/*
	 * Funcao que altera o valor da propriedade id.
	 * @param strong $id número identificador.
	 * @Return void.
	 */
	 public function setId($id){
		 $this->id = $id;
	}

	/*
	 * Função que mostra a 
	 */
	public function getId($id){
		return $this->id;
	}

	/*
	 * Método READ: Leituras dos base de dados
	 */
	public function read($where = null, $limit = null, $offset = null, $orderby = null){						               
           $where	= ($where	!= null ? "WHERE {$where}"		: "" );
		$limit  = ($limit	!= null ? "LIMIT {$limit}"		: "" );
		$offset = ($offset	!= null ? "OFFSET{$offset}"		: "" );
		$orderby= ($orderby	!= null ? "ORDER BY{$orderby}"	: "" );
		$date	= ($data	!= null ? ", DATE_FORMAT({$this->data}, '%d/%m/%Y') AS data" : "");

		$sql = $this->connect->query("SELECT {$this->$campos} {$date} FROM `{%this->_tabela}` {$where} {$limit} {$orderby} {$offset}");

               return self::PDO($sql); 
	}
}
?>

[/code]

 

Se pode me ajudar a montar os restante....

 

E você tá fazendo errado no método read. Você não precisa fazer isso:

$this->connect->query

 

O método PDO é justamente para isso, você tá executando a query duas vezes! Passe o seu SQL diretamente como parametro do método PDO, por que lá dentro já faz o prepare() e o execute(), além de retornar os valores como array() quando você der um SELECT.

 

Além do mais, esse $this->connect->query não tem valor algum. Onde ele está sendo usado na classe pra abrir a conexão? Que eu saiba é o atributo private static $conn. Ahh, e isso NEM vai executar, por que primeiro o $this->connect->query não tem nenhum valor guardado da conexão, e segundo que você chamou o PDO, passando o $sql como parametro, sendo o que no $sql, você já tá fazendo $this->connect->query errado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem simplificado, é mais ou menos isso aqui:

 

<?php
interface DataAccessObject {
public function insert(array $data);
public function update(array $data, $cond);
public function delete($cond);
public function getAll();
public function getOne($id);
}

abstract class Db_TableGateway implements DataAccessObject {
protected $_adapter;
protected $_name;
protected $_fields = array();
public function __construct(Db_Adapter $adapter){
	$this->_adapter = $adapter;
}

public function insert(array $data) {
	return $this->_adapter->insert($this->_name, $data);
}

public function update(array $data, $cond) {
	return $this->_adapter->update($this->_name, $data, $cond);
}

public function delete($cond) {
	return $this->_adapter->delete($this->_name, $cond);
}
}

class UserGateway extends Db_TableGateway {
protected $_name = 'users';
protected $_fields = array('id', 'user_name', 'user_login', 'user_password');
public function getAll(){
	$sql = 'SELECT * FROM users';
	return $this->_adapter->fetchAll($sql);
}

public function getOne($primaryKey) {
	$sql = 'SELECT * FROM users WHERE id = ' . (int) $primaryKey;
	return $this->_adapter->fetchOne($sql);
}
}

abstract class Db_Adapter {
protected $_config = array();
protected $_connection;

public function __construct(array $config) {
	$this->_checkOptions($config);
	$this->_config = $config;
}

protected function _checkOptions(array $config) {
   	if (! array_key_exists('dbname', $config)) {
       	throw new Exception("Nenhum banco de dados selecionado na configuração");
   	}

   	if (! array_key_exists('password', $config)) {
       	throw new Exception("Senha para conexão com o banco de dados não informada");
   	}

   	if (! array_key_exists('username', $config)) {
       	throw new Exception("Usuário para conexão com o banco de dados não informado");
   	}

   	if (! array_key_exists('host', $config)) {
       	throw new Exception("Servidor para conexão com o banco de dados não informado");
   	}
}

abstract protected function _connect();
abstract public function disconnect();
abstract public function query($sql);
abstract public function fetchAll($sql);
abstract public function fetchOne($sql);

public function insert($table, array $values){
	$this->_connect();

	$fields = array_keys($values);
	$stmt = "INSERT INTO \n" 
				. $table . "\n"
				. '(' . join(', ', $fields) . ')' . "\n"
				. 'VALUES (' . join(',', $this->_quote($fields)) . ')';
	return $this->query($stmt);
}

public function update($table, array $values, $cond){
	$this->_connect();

	$set = array();
	foreach($values as $field=>$val){
		$set[] = $field . ' = ' . $this->_quote($val);
	}

	$stmt = "UPDATE \n" 
				. $table . "\n" 
				. "SET\n"
				. join(', ', $set) . "\n"
				. 'WHERE ' . $cond;

	return $this->query($stmt);
}

public function delete($table, $cond){
	$this->_connect();

	$stmt = "DELETE FROM \n" 
				. $table . "\n" 
				. 'WHERE ' . $cond;
	return $this->query($stmt);
}

abstract public function lastInsertId();
abstract protected function _quote($value);
}

class Db_Adapter_Mysqli extends Db_Adapter {
protected function _connect(){
	if($this->_connection !== null){
		return;
	}

	$host = $this->_config['host'];
	$dbname = $this->_config['dbname'];
	$user = $this->_config['user'];
	$pswd = $this->_config['password'];
	$this->_connection = new mysqli($host, $dbname, $user, $pswd); 
}

public function disconnect() {
	$this->_connection->close();
}

public function query($sql) {
	$this->_connect();
	return $this->_connection->query($sql);
}

public function fetchOne($sql) {
	$result = $this->query($sql);
	return $result ? $result->fetch_assoc() : null;
}

public function fetchAll($sql) {
	$data = array();
	$result = $this->query($sql);
	while($row = $result->fetch_assoc()){
		$data[] = $row;
	}
	return $data;
}

public function lastInsertId(){
	return $this->_connection->insert_id;
}

public function _quote($value){
	if(is_array($value)){
		foreach($value as &$val){
			$val = $this->_quote($val);
		}
		return $value;
	} else {
		if(!is_int($value) || !is_float($value) {
			$value = "'" . $value . "'";
		}
		return $value;
	}
}		
}

abstract class Model {
protected $_dao;
public function __construct(DataAccessObject $dao){
	$this->_dao = $dao;
}
}

class UserModel extends Model {
public function insert(array $data) {
	//Faz a lógica da aplicação, verifica se o usuário já existe, etc, etc, etc

	$this->_dao->insert($data);		

	//Pós inserção
}
}

//Utilização:
$config = array(
		'host' 		=> 'localhost',
		'user' 		=> 'root',
		'password' 	=> 'xxxx',
		'dbname' 	=> 'teste'
	);

$userGateway = new UserGateway(new Db_Adapter_Mysqli($config));
$model = new UserModel($userGateway);
$data = array_filter($_POST);
$model->insert($data);

 

Agora se um dia você quiser por alguma razão deixar de utilizar um banco de dados e salvar tudo em arquivos XML é fácil.

Você só precisa implementar uma classe XmlGateway que implementa a interface DataAccessObject e passá-la como parâmetro:

class XmlGateway implements DataAccessObject {
  //defina as funções
}

//Utilização
$model = new UserModel(new XmlGateway());
$data = array_filter($_POST);
$model->insert($data);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fui eu mesmo que escrevi isso aí... Ficou sem comentários pois fiz meio correndo... Fim de semestre na faculdade é meio tenso...

Vou ver se comento e posto aqui de novo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz algumas modificações e comentei o código:

 

/**
* Descreve uma interface de acesso a dados
* Nota: Neste contexto, "base de dados" é qualquer
* tipo de armazenamento secundário de arquivos, como
* bancos de dados, arquivos de texto, arquivos binários,
* arquivos XML, feeds RSS, etc.
*
* @author henrique
*/
interface DataAccessObject {
/**
    * Insere um array de dados no base de dados
    *
    * @param array $data : os dados a serem inseridos
    * @return boolean
    */
public function insert(array $data);

/**
    * Atualiza os dados na base de dados
    * sob a condição $cond para os dados informados em $data
    *
    * @param array $data : os dados para atualização
    * @param string $cond : a condição para busca dos dados a serem atualizados
    * @return boolean
    */
public function update(array $data, $cond);

/**
    * Remove os dados sob a condição $cond da base de dados
    *
    * @param string $cond
    * @return boolean
    */
public function delete($cond);

/**
    * Retorna todos os dados armazenados
    *
    * @return array
    */
public function getAll();

/**
    * Retorna um dado específico da base de dados.
    * Tal registro precisa ter um identificador único
    *
    * @param mixed $id : o identificador único do arquivo buscado
    */
public function getOne($id);
}

/**
* Implementação básica do padrão de projeto TableDataGateway.
* Como se trata de um método de acesso a dados, implementamos
* a interface DataAccessObject.
*
* @author henrique
*/
abstract class Db_TableGateway implements DataAccessObject {
/**
    * A conexão com o banco de dados não deve ser dependente da implementação.
    * Para que a nossa aplicação se adapte facilmenta aos diversos SGBDs
    * existentes, nos utilizamos do padrão de projeto Adapter para
    * abstrair operações diretamente sobre o banco de dados.
    *
    * @var Db_Adapter
    */
protected $_adapter;

/**
    * Armazena o nome da tabela à qual o gateway se refere.
    * @var string
    */
protected $_name;

/**
    * Armazena os nomes dos campos existentes na tabela
    *
    * @var unknown_type
    */
protected $_fields = array();


/**
    * Construtor
    *
    * @param Db_Adapter $adapter : utilizamos Dependency Injection aqui.
    * Se algum dia quisermos trocar de SGDB, a única alteração necessária
    * no script seria a troca do Db_Adapter passado como parâmetro para
    * este construtor.
    */
public function __construct(Db_Adapter $adapter){
	$this->_adapter = $adapter;
}

/**
    * (non-PHPdoc)
    * @see DataAccessObject::insert()
    */
public function insert(array $data) {
	//Filtra o array, removendo campos que não existem na tabela
	$insertData = $this->_verifyFields($data);
	if(empty($insertData)) {
		throw new Exception('Nenhum campo para inserir na tabela ' . $this->_name);
	}

	//Chama no adapter a função de inserção, a nível de banco de dados 
	return $this->_adapter->insert($this->_name, $insertData);
}

/**
    * (non-PHPdoc)
    * @see DataAccessObject::update()
    */
public function update(array $data, $cond) {
	//Filtra o array, removendo campos que não existem na tabela
	$updateData = $this->_verifyFields($data);
	if(empty($updateData)) {
		throw new Exception('Nenhum campo para atualizar na tabela ' . $this->_name);
	}

	//Chama no adapter a função de atualização, a nível de banco de dados
	return $this->_adapter->update($this->_name, $updateData, $cond);
}

/**
    * (non-PHPdoc)
    * @see DataAccessObject::delete()
    */
public function delete($cond) {
	//Chama no adapter a função de remoção, a nível de banco de dados
	return $this->_adapter->delete($this->_name, $cond);
}

/**
    * Verifica os índices em um array $data, removendo
    * aqueles que não constam na propriedade $this->_fields
    * @param array $data : os dados para entrada
    * @return array : os dados filtrados
    */
protected function _verifyFields(array $data) {
	/* Vamos nos certificar que todos os índices do array $data
     * possuem nomes de campos existentes na tabela.
	*/
	$verifiedData = array();

	/* Suponha o array $data da forma:
     * $data = array(
     * 			'coluna1' => 'valor1',
     * 			'coluna2' => 'valor2',
     * 			'coluna3' => 'valor3',
     * 		);
     *
	     * Suponha também que a propriedade $this->_fields tem os valores:
     * $this->_fields = array('coluna1', 'coluna3');
     *
     * Nos certificaremos que o valor sob o índice 'coluna2' não será
     * passado adiante, pois essa coluna não existe na tabela
     */
	foreach($data as $key=>$val) {
		//Se a chave (ex.: 'coluna1', acima) É ENCONTRADA no array de campos... 
		if(in_array($key, $this->_fields)) {
			//Adicionamos o valor ao retorno...
			$verifiedData[$key] = $val;
		}
	}

	//Retornamos os dados verificados, sem campos inválidos
	return $verifiedData;
}
}

/**
* Representa a interface com a tabela users
* 
* @author henrique
*/
class UserGateway extends Db_TableGateway {
//Repare que devemos definir as propriedades em branco na superclasse Db_tableGateway

//Definimos o nome da tabela...
protected $_name = 'users';

//... e seus campos
protected $_fields = array('id', 'user_name', 'user_login', 'user_password');

/**
    * Retorna todos os usuários do banco de dados
    * @see DataAccessObject::getAll()
    */
public function getAll(){
	$sql = 'SELECT * FROM users';
	return $this->_adapter->fetchAll($sql);
}

/**
    * Retorna o usuário com id = $id
    * @see DataAccessObject::getOne()
    */
public function getOne($id) {
	$sql = 'SELECT * FROM users WHERE id = ' . (int) $id;
	return $this->_adapter->fetchOne($sql);
}
}

/**
* Implementação do padrão Adapter para conexão com
* o banco de dados. Abstrar a maior parte das funções
* sobre um banco de dados sob uma interface mais simples
* 
* @author henrique
*/
abstract class Db_Adapter {
/**
    * Array de configuração para a conexão.
    * Exemplo:
    * 		array(
    * 				'host' 		=> 'localhost',
    * 				'user' 		=> 'usuario',
    * 				'password' 	=> 'xxxx',
    * 				'dbname' 	=> 'teste'
    * 			);
    * @var array
    */
protected $_config = array();

/**
    * Armazena o driver de conexão com o banco de dados
    * @var resource | object
    */
protected $_connection;

/**
    * Construtor. Cria o adapter.
    * 
    * @param array $config : as configurações para conexão
    */
public function __construct(array $config) {
	$this->_checkOptions($config);
	$this->_config = $config;
}

/**
    * Checa se as configurações necessárias foram informadas
    * 
    * @param array $config
    * @throws Exception
    */
protected function _checkOptions(array $config) {
	if (! array_key_exists('dbname', $config)) {
		throw new Exception("Nenhum banco de dados selecionado na configuração");
	}

	if (! array_key_exists('password', $config)) {
		throw new Exception("Senha para conexão com o banco de dados não informada");
	}

	if (! array_key_exists('username', $config)) {
		throw new Exception("Usuário para conexão com o banco de dados não informado");
	}

	if (! array_key_exists('host', $config)) {
		throw new Exception("Servidor para conexão com o banco de dados não informado");
	}
}

/**
    * Abre a conexão com o banco de dados
    * 
    * @return void
    */
abstract protected function _connect();

/**
    * Fecha a conexão com o banco de dados
    * 
    * @return void
    */
abstract public function disconnect();

/**
    * Executa uma query
    * 
    * @param string $sql : a sentença SQL a ser executada
    */
abstract public function query($sql);

/**
    * Executa e traz todos os resultados de uma query
    * @param string $sql
    */
abstract public function fetchAll($sql);

/**
    * Executa e traz o primeiro resultado de uma query
    * 
    * @param string $sql
    */
abstract public function fetchOne($sql);

/**
    * Insere os dados $vales na tabela $table
    * @param string $table : o nome da tabela
    * @param array $values : o array de dados para inserir
    * 		Exemplo: 
    * 			$values = array(
    * 				'id' => 1,
    * 				'user_name' => 'Henrique Barcelos',
    * 				'user_login' => 'henrique',
    * 				'user_password' => 'xxxx'
    * 			);
    * 			$table = 'users';
    * 
    * 		Ira gerar e executar a seguinte query:
    * 			INSERT INTO 
    * 			users(id, user_name, user_login, user_password)
    * 			VALUES(1, 'Henrique Barcelos', 'henrique', 'xxxx');
    * 			
    */
public function insert($table, array $values){
	$this->_connect();

	$fields = array_keys($values);
	$stmt = "INSERT INTO \n"
			. $table
			. '(' . join(', ', $fields) . ')' . "\n"
			. 'VALUES (' . join(',', $this->_quote($fields)) . ')';
	return $this->query($stmt);
}

/**
    * Atualiza na tabela $table os dados nos quais se verifica 
    * a condição $cond para os dados informados em $values
    * 
    * @param string $table : o nome da tabela
    * @param array $values : os valores para atualizar
    * @param string $cond : a condição que a entrada da tabela 
    * 						deve obedecer para ser atualizada
    * 
    * 		Exemplo:
    * 			$values = array(
    * 				'user_name' => 'Henrique J. P. Barcelos',
    * 				'user_login' => 'henrique',
    * 				'user_password' => 'yyyy'
    * 			);
    * 			
    * 			$table = 'users';
    * 			$cond = 'id = 1';
    * 
    * 		Ira gerar e executar a query:
    * 			UPDATE users SET
    * 			user_name = 'Henrique J. P. Barcelos',
    * 			user_login = 'henrique',
    * 			user_password = 'yyyy'
    * 			WHERE id = 1 
    */
public function update($table, array $values, $cond){
	$this->_connect();

	$set = array();
	foreach($values as $field=>$val){
		$set[] = $field . ' = ' . $this->_quote($val);
	}

	$stmt = "UPDATE "
			. $table
			. " SET\n"
			. join(",\n", $set) . "\n"
			. 'WHERE ' . $cond;

	return $this->query($stmt);
}

/**
    * Remove os dados da tabela $table que 
    * satisfaçam a condição $cond
    * 
    * @param string $table
    * @param string $cond
    * 
    * 		Exemplo:
    * 			$table = 'users';
    * 			$cond = 'id = 1';
    * 
    * 		Ira gerar e executar a query:
    * 			DELETE FROM users
    * 			WHERE id = 1 
    * 
    */
public function delete($table, $cond){
	$this->_connect();

	$stmt = "DELETE FROM \n"
	. $table . "\n"
	. 'WHERE ' . $cond;
	return $this->query($stmt);
}

/**
    * Retorna o último ID auto_increment inserido
    * durante a conexão atual com o BD
    * 
    * @return int 
    */
abstract public function lastInsertId();

/**
    * Adiciona aspas e escapes a uma string a ser
    * inserida no banco de dados
    * @param string $value
    */
abstract protected function _quote($value);
}

/**
* Nosso único adapter para este exemplo.
* Representa uma conexão feita através da 
* extensão MySQLi
* 
* @author henrique
*/
class Db_Adapter_Mysqli extends Db_Adapter {
/**
    * Implementa o método abstrato, 
    * definido em Db_Adapter
    * @see Db_Adapter::_connect()
    */
protected function _connect(){
	//Se a conexão já foi inicializada, não precisamos prosseguir
	if($this->_connection !== null){
		return;
	}

	$host = $this->_config['host'];
	$dbname = $this->_config['dbname'];
	$user = $this->_config['user'];
	$pswd = $this->_config['password'];

	//Cria a conexão com o banco de dados
	$this->_connection = new mysqli($host, $dbname, $user, $pswd);
}

/**
    * Implementa o método abstrato,
    * definido em Db_Adapter
    * @see Db_Adapter::disconnect()
    */
public function disconnect() {
	if($this->_connection !== null) {
		$this->_connection->close();
		unset($this->_connection);
		$this->_connection = null;
	}
}

/**
    * (non-PHPdoc)
    * @see Db_Adapter::query()
    */
public function query($sql) {
	$this->_connect();
	return $this->_connection->query($sql);
}

/**
    * (non-PHPdoc)
    * @see Db_Adapter::fetchOne()
    */
public function fetchOne($sql) {
	$result = $this->query($sql);
	return $result ? $result->fetch_assoc() : null;
}

/**
    * (non-PHPdoc)
    * @see Db_Adapter::fetchAll()
    */
public function fetchAll($sql) {
	$data = array();
	$result = $this->query($sql);
	while($row = $result->fetch_assoc()){
		$data[] = $row;
	}
	return $data;
}

/**
    * (non-PHPdoc)
    * @see Db_Adapter::lastInsertId()
    */
public function lastInsertId(){
	return $this->_connection->insert_id;
}

/**
    * (non-PHPdoc)
    * @see Db_Adapter::_quote()
    */
public function _quote($value){
	//Se temos um array...
	if(is_array($value)){
		//Precisamos iterar por ele, aplicando a função à cada posição...
		foreach($value as &$val){
			$val = $this->_quote($val);
		}
		return $value;
	} else {
		//Se não temos um valor inteiro ou de ponto flutuante...
		if(!is_int($value) || !is_float($value)) {
			//Precisamos adicionar aspas e colocar escapes em caracteres como '`"\
			$value = "'" . $this->_connection->real_escape_string($value) . "'";
		}
		return $value;
	}
}
}

/**
* Representa um modelo da Aplicação, ou seja, tudo o que diz respeito
* à lógica do negócio vai aqui, ou melhor, nas suas classes filhas
* 
* @author henrique
*/
abstract class ApplicationModel {
protected $_dao;
public function __construct(DataAccessObject $dao){
	$this->_dao = $dao;
}
}

/**
* Representa a lógica do negócio referente a um usuário
* 
* @author henrique
*/
class UserModel extends ApplicationModel {
/**
    * Insere os dados (recebidos de um controller, por exemplo)
    * @param array $data
    */
public function insert(array $data) {
	//Faz a lógica da aplicação, verifica se o usuário já existe, etc, etc, etc

	$this->_dao->insert($data);

	//Pós inserção
}

public function verifyExistis($username){
	//Verifica se um usuário já existe na base de dados...		
}
}

 

 

Qualquer dúvida, poste...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ahn? Model estendendo PDO?

Errado... Leia:

http://pt.wikipedia....3%A3o_de_Liskov

 

PDO é para conexão com banco de dados.

Model cuida da lógica da sua aplicação, que coincidentemente utiliza banco de dados como armazenamento, mas poderia ser um XML, arquivos texto, etc...

 

Nesse caso, não cabe herança, e sim, composição, pois Model NÃO É UM PDO, o Model TEM UM PDO.

 

interessante, você disse que o model cuida da logica, e o seu model tem apenas metodos para armazenagem dos dados, eu nao vi metodos que eu poderia usar para modificar algumas regras, como por exemplo, inputar um juros em sistema de vendas...poderia explicar um pouco?assim acaba virando um simples DAO (Data Access Object - objeto de acesso a dados) e nao um Model (modelo), se o model cuida da logica, portanto, das regras de negocios...ja o bean ou valueobject cuida da entrada, saida e validacao dos dados, assim como o DAO cuida de sua gravacao e leitura de dados...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Henrique

Gostei bastante do seu código, vou pegar algumas idéias, e implementar em meu novo sistema. Porém, me tira uma dúvida que bateu.

 

Porque você tá usando interface, classes abstratas e esse tanto de classes?

Eu quero realmene entender o motivo disso tudo, principalmente a inteface e classes abstratas, quando usar e por que usar.

 

Desde já, agradeço sua ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

guilherme, você usa um sistema operacional que tem interface, você pode criar uma pasta com o botao direito do mouse, isto eh uma das funcoes da interface q você usa no seu sistema operacional, mas pode usar um comando tb em um prompt ou terminal, ou seja, uma interface diz que metodos seu cliente usara, pode ver q nao podes colocar metodo private ou protected numa interface, somente publicos, ja uma classe abstrata ela segue a ideia de uma interface, com uma diferenca, ela pode implementar os metodos, cada metodo pode ter seu codigo, e como uma classe abstrata nao pode ser instanciada diretamente, ela sofrera uma heranca,

 

uma coisa que ninguem nota eh que você pode ter metodos para uso proprio, ae seriam os privates, os protected sao para uso priprio e dos filhos, e os publicos oq so clientes(ou seja outras classe q a usara) podem usar..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Igor

Certo. Digamos que eu crio uma interface com 3 métodos, e uma classe que implementará essa interface. Esta classe obrigatoriamente terá que usar os 3 métodos da interface?

 

E esse mesmo esquema que disse acima fosse aplicado pra classe abstrata?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, a classe q implementa a interface tem obrigacao de implementar os metodos que a interface propoe, com a mesma assinatura, digo, se um metodo da interface tiver 2 parametros, o metodo la na classe tera de ter 2 parametros, se tiver um parametro obrigatorio e um parametro default, a mesma coisa, tera de ter um obrigatorio e um default...sobre a classe abstrata, la no manual do php diz o seguinte:"toda classe abstrata devera contar um metodo abstrato", o metodo abstrato nao tem obrigacao de ter sua implementacao, ou seja, identico na interface, mas na classe q herdar sim...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá, mais pera aí. Supondo o seguinte:

 

<?

abstract class CRUD{

protected function insert();
protected function update();
protected function delete();
protected function getAll(){
          $query = "SELECT * FROM clientes";
       }
protected function getOne();
}

class Usuario extends CRUD{

public function getAll(){
	return parent::getAll();	
}
}

?>

Fiz aqui agora somente pra eu entender a lógica. Neste exemplo tosco, eu posso fazer isto?

OBS: não testei o código, não considere erros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

na verdade seria

 

<?

abstract class CRUD{

       public abstract function insert();
       public abstract function update();
       public abstract function delete();
       public function getAll(){
          $query = "SELECT * FROM clientes";
       }
       public  abstract function getOne();
}

class Usuario extends CRUD{


}

no caso os metodos abstratos eh q você implementaria no 'usuario', o gettAll, nao tem pq dar um parent, pq ele ja esta sendo herdado..e todos seriam public pq o seu cliente, a classe q usar esta usaria estes metodos...use este exemplo e rode-o...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou testar e logo retorno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.