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!

 

  Em 04/12/2011 at 23:59, ronaldoalmeida disse:

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:

  Citar

$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:

 

  Mostrar conteúdo oculto

 

 

Qualquer dúvida, poste...

Compartilhar este post


Link para o post
Compartilhar em outros sites
  Em 05/12/2011 at 00:44, Henrique Barcelos disse:

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.