Ir para conteúdo

POWERED BY:

Arquivado

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

Vadio

Mvc

Recommended Posts

Pessoal to tentando monta um pequeno sistema com tudo oque eu aprendi desde o principio das minhas programação

Gostaria que fizessem uma pequena analise do meu código e me dissessem se estou indo no caminho correto..

 

model

class Usuario_model {
public $id;
protected $permissao_id;
protected $email;
protected $senha;

public function getId() {
	return $this->id;
}


public function getPermissao_id() {
	return $this->permissao_id;
}

public function getEmail() {
	return $this->email;
}

public function getSenha() {
	return $this->senha;
}

public function setId($id) {
	if(!is_numeric($id)) return false;
	else $this->id = $id;
	return true;
}

public function setPermissao_id($permissao_id) {
	if(!is_numeric($permissao_id)) return false;
	else $this->permissao_id = $permissao_id;
	return true;
}

public function setEmail($email) {
	$Validate = new Validate();
	if($Validate->email($email)){
		$this->email = $email;
		return true;
	}else return false;	
}

public function setSenha($senha) {
	$Validate = new Validate();
	if(!$Validate->length('min', 5,strlen($senha))) return false;
	if(!$Validate->length('max', 32,strlen($senha))) return false;
	$this->senha = $senha;
	return true;
}

}

view

class Usuario_vo extends view{
function __construct(){
	$this->model = new Usuario_model();
	$this->controller = new Usuario_ctrl();
}

public function login(){
	$params = parent::postParams();

	$email = isset($params['email']) ? $params['email'] :null;
	$senha = isset($params['senha']) ? $params['senha'] :null;

	try{
		//validação de dados 
		if(!$this->model->setEmail($email)) throw new myErrorException('E-mail inválido');
		if(!$this->model->setSenha($senha)) throw new myErrorException('Senha inválida');

		//retorno banco 
		$result = $this->controller->login($this->model->getEmail(), $this->model->getSenha());

		//fetch class
		$Usuario = $result->fetchAll(PDO::FETCH_CLASS,'Usuario_model');

		//verifica resultado 
		if(empty($Usuario)) throw new myErrorException('E-mail e/ou senha inválidos');

		//controller.Usuario.setSession
		if(isset($Usuario) && sizeof($Usuario) == 1) $this->controller->setSession($Usuario);

	}catch (myErrorException $e){
		echo $e->getMessage();
	}
}

public function logout(){
	try{
		if(!$this->controller->logout()) throw new myErrorException('Não foi possivel realizar o logout');
	}catch (myErrorException $e){
		echo $e->getMessage();
	}
}

public function verificaLogado(){
	try{
		if(!$this->controller->verificaLogado()) throw new myException('0');
		else throw new myException('1');
	}catch (myException $e){
		echo $e->getMessage();
	}
}

public function doInsert(){
	$email = $this->params['email'];
	$senha = $this->params['senha'];
	$senha_ag = $this->params['senha_ag'];

	try{
		$V = new Validate();
		if(!$V->equalTo($senha, $senha_ag)) throw new myErrorException('Senha não confere');			
		if(!$this->model->setEmail($email)) throw new myErrorException('E-mail inválido');
		if(!$this->model->setSenha($senha)) throw new myErrorException('Senha inválida');

		$result = $this->controller->insert($email, $senha);

		$this->login();

	}catch (myErrorException $e){
		echo $e->getMessage();
	}
}
}

controller

class Usuario_ctrl extends Controller{
public function setSession($Usuario){
	$_SESSION['usuario'] = $Usuario;
}

public function login($email,$senha){
	$sql = "SELECT * FROM Usuario WHERE Usuario.email= '$email' AND Usuario.senha= MD5('$senha');";
               $Mypdo = new MyPDO();
               $result = $Mypdo->query($sql);
               return $result;
}

public function logout(){
	if(session_destroy()) return true;
	else return false;
}

public function verificaLogado(){	
	if(!isset($_SESSION['usuario'])) return false;
	else return true;
}

public function insert($email,$senha,$permissao_id = 5){

	$sql = 'INSERT INTO Usuario (id,permissao_id,email,senha) VALUES ("",?,?,md5(?));';

	$Mypdo = new myPDO();	
	$stmt = $Mypdo->prepare($sql);
	$result = $stmt->execute(array($permissao_id,$email,$senha)) or die('errorCode:'.$Mypdo->errorCode().' - errorInfo:'.var_dump($Mypdo->errorInfo()));
	$id = $Mypdo->lastInsertId();

	$Pessoa = new Pessoa_ctrl();
	$resultPessoa = $Pessoa->insert($id);

	if(!$resultPessoa) return false;

	return $result;
}	
}

 

View

class View {
protected $model;
protected $controller;

public function getParams(){
	return $this->controller->getParams();
}
public function postParams(){
	return $this->controller->postParams();
}
}

Controller

class Controller {
function __construct(){
	@session_start();
}
public function postParams(){
	$params = null;

	if(isset($_POST)) 
		foreach($_POST as $key => $val)
			if($key != 'submit') $params[$key] = $val; 		

	return $params;
}
public function getParams(){
	$params = null;
	if(isset($_GET)) foreach ($_GET as $key => $val) $params[$key] = $val;
	return $params;
}	
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Explicação básica, Controller controla, Model cuida de dados, View é tudo que tem que ser exibido.

ValueObject não deve conhecer a View, nem se quer, derivar dela.

 

Outra coisa, até onde eu saiba, VO serve pra representar dados (Entidade), portanto as implementações de insert, delete, update e select são partes que ficam no CRUD(Create Read Update Delete) e seu CRUD usar o seu VO se for necessário.

 

As operações CRUD podem ser implementadas na Model, onde você terá métodos como insertUser, updateUser, ... findAll e coisas do tipo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

certo, mas como irei informar q ouve um erro na validação de um determinado dado na minha view se não posso

utilizar essa linha:

if(!$this->model->setEmail($email)) throw new myErrorException('E-mail inválido');

 

como falei no outro post, parti do seguinte principio

 

meu model é só um modelo de dados

meu controller é responsavel pela interação com DB

minha view é responsavel por mostrar as mensagens de erro ou resultados de consultas

 

existe algum exemplo prático de alguma pequena aplicação só pra eu poder me basear e intender melhor oq você está querendo me passar?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

certo, mas como irei informar q ouve um erro na validação de um determinado dado na minha view se não posso

utilizar essa linha:

if(!$this->model->setEmail($email)) throw new myErrorException('E-mail inválido');

 

como falei no outro post, parti do seguinte principio

 

meu model é só um modelo de dados

meu controller é responsavel pela interação com DB

minha view é responsavel por mostrar as mensagens de erro ou resultados de consultas

 

existe algum exemplo prático de alguma pequena aplicação só pra eu poder me basear e intender melhor oq você está querendo me passar?

 

Obrigado

 

Ta aqui o erro.

 

Controller, trabalha em conjunto com a View para compor a User Interface.

 

No caso de aplicações web, Controller valida as requisições, fica responsável por erros 403, 404.

 

Quem informa que Usuario->nome = 'Nome não pode conter números 123' é um nome inválido é a model.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu model na verdade é o VO (ou, na denominação mais correta, DTO).

Seu VO é o model, que como já dito não deve conhecer nem estender a View.

 

O acesso aos dados é feito no model, mas não faça coisas como:

Usuario_Model extends PDO {
}

Na verdade o Model TEM UM (ou mais) objetos de acesso à camada de persistência, o que caracteriza uma composição.

 

class View {
       protected $model;
       protected $controller;

 

Errado também, a View não precisa conhecer o model e nem o controller. O controller é quem controla (ah vá?) a view.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Errado também, a View não precisa conhecer o model e nem o controller. O controller é quem controla (ah vá?) a view.

Divirjo, divirjo... :P

 

A View não deve conhecer o objeto Controller, mas para renderizar um Template View automaticamente, é bem útil que ela saiba pelo menos o nome do Controller, dado pelo nome-base de sua classe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Man, eu acho que no MVC você divide sua aplicação em Modelo, Controle e Vizualização..

Sugiro você estudar o ZEND FRAMEWORK, ou outros Framework(tb to precisando).. Assim você vai entender como é o pattern MVC e muitos outros como Observator e Singleton..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Man, eu acho que no MVC você divide sua aplicação em Modelo, Controle e Vizualização..

Sugiro você estudar o ZEND FRAMEWORK, ou outros Framework(tb to precisando).. Assim você vai entender como é o pattern MVC e muitos outros como Observator e Singleton..

Errado, nem sempre estudando o que já tá feito, é que você entende como funciona...

Não nego que ver uma implementação facilita nos estudos, mas como você disse 'entender' eu acho que é uma forma errada.

 

Leia sobre o que você quer saber, tente fazer o seu da forma que você entendeu, poste no fórum e pergunte se está correto, e a partir disso, vá tirando suas dúvidas, vai perguntando 'porque', e etc ... assim você aprende bem mais, porque irá ler várias opiniões de formas (às vezes) diferente.

 

;)

 

É o que eu acho, é meu ponto de vista, se alguém tem algo contra, por favor se manifeste !

Compartilhar este post


Link para o post
Compartilhar em outros sites
A View não deve conhecer o objeto Controller, mas para renderizar um Template View automaticamente, é bem útil que ela saiba pelo menos o nome do Controller, dado pelo nome-base de sua classe.

Claro, existem implementações e implementações. Entretanto, para termos uma estrutura MVC a View não pode realizar chamadas de métodos de Controllers.

 

Leia sobre o que você quer saber, tente fazer o seu da forma que você entendeu, poste no fórum e pergunte se está correto, e a partir disso, vá tirando suas dúvidas, vai perguntando 'porque', e etc ... assim você aprende bem mais, porque irá ler várias opiniões de formas (às vezes) diferente.

Só reiterando, é importante entender a teoria primeiro. Quando estiver seguro de que entende como a coisa é em teoria, aí sim é hora de fuçar nos códigos-fonte dos frameworks já existentes. Sempre vai ter uma peculiaridade, uma questão de implementação que você fica quebrando a cabeça pra resolver e que já está pronta nos frameworks...

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom lendo tudo isso não consigo imaginar qual a função da view. uma vez que meus dados requisitados são objetos Json ou informacoes bool.

 

se essas informações saem do meu modelo / controller pra que utilizar a view?

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom lendo tudo isso não consigo imaginar qual a função da view. uma vez que meus dados requisitados são objetos Json ou informacoes bool.

 

se essas informações saem do meu modelo / controller pra que utilizar a view?

 

A visão formata um mesmo conjunto de dados em diferentes formas. Diferentes 'pontos de vista'.

 

Um mesmo model pode gerar um output XML para webservices SOAP, um output JSON para webservices RESTful, um CSV para importar no Excel e um HTML para ver no browser.

 

Citei 4 views, que usarão como base um mesmo model.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A View não mostra os dados. Ela monta a Resposta que será enviada e, consequentemente, quem envia a Resposta é outra classe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Evandro oliveira então na minha view eu crio lá por exemplo 3 funções por exemplo:

- arrayToJson

- arrayToXML

- arrayVarDump

 

e chamo ela do meu controller certo?

 

Sendo assim meu usuario dará call no controller que fará a validação dos dados junto com meu modelo e utilizará a view para mostrar meus dados estou certo?

 

Bruno Augusto

meu usuario da call numa pág chamada Main.php

Esse Main.php da call numa classe chamada Receive q irá montar minha requisição de dados

eu ainda não tive tempo para alterar meu cód da forma correta por isso ele chama minha view seguindo a forma do primeiro post.

 

mas como conclui na minha resposta anterior devo fazer uma enorme alteração no meu cód para que funcione de maneira correta. mesmo assim segue info de como do o call na minha view q logo mudara para controller pois aí ainda estava usando a forma errada de programar em MVC.

 

Obrigado mais uma vez e mesmo assim não deem o tópico como resolvido pois creio q ainda haverão dúvidas no decorrer de minhas alterações.

 

Main.php

include 'app/controller/myException.php';
include 'app/controller/MyPDO.php';
include 'app/model/Validate.php';
/**
* MVC
*/
//GLOBAIS
include 'app/controller/Controller.php';
include 'app/view/View.php';

//Usuario
include 'app/controller/Usuario_ctrl.php';
include 'app/model/Usuario_model.php';
include 'app/view/Usuario_vo.php';

//Pessoa
include 'app/controller/Pessoa_ctrl.php';
include 'app/model/Pessoa_model.php';
include 'app/view/Pessoa_vo.php';

//Receive
include 'app/view/Receive_vo.php';
include 'app/controller/Receive_ctrl.php';
include 'app/model/Receive_model.php';

/**
* Inicia sistema
*/
$R = new Receive_vo();
$R->callView();

Request MVC

//view
class Receive_vo extends view{
function __construct(){
	$this->model = new Receive_model();
	$this->controller = new Receive_ctrl();
}

function callView(){
	$params = $this->controller->getParams();
	$obj = isset($params['obj']) ? $params['obj'] : null;
	$q = isset($params['q']) ? $params['q'] : null;

	if($obj != null){
		$View = null; 	
		eval("\$View = new $obj"."_vo('$obj');");
	}
	try{
		switch($obj){
			case 'Usuario':
				switch($q){
					case 'login':
						$View->login(); break;
					case 'logout':
						$View->logout(); break;
					case 'verificaLogado':
						$View->verificaLogado(); break;
					case 'doInsert':
						$View->doInsert(); break;
					default:
						throw new myErrorException('Ação inválida','404'); break;
				}break; //end Usuario
			case 'Pessoa':
				switch ($q){
					case 'update':
						$View->update(); break;
				}break; //end Pessoa
			default:
				throw new myErrorException('Objeto inválido','404'); break;	
		}//end switch $obj
	}catch (myErrorException $e){
		echo $e->toJson();
	}	
}
}

//controller
class Receive_ctrl extends controller{

}

//model
class Receive_model {
protected $obj;
protected $q;
public function getObj() {
	return $this->obj;
}

public function getQ() {
	return $this->q;
}

public function setObj($obj) {
	if(empty($obj)) return false;
	else $this->obj = $obj;
	return true;
}

public function setQ($q) {
	if(empty($q)) return false;
	$this->q = $q;
	return true;
}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom pessoal.

minha view fico básicamente sem fazer nada lol...

 

Percebi nesse cod q não adianta colocar minha view dentro do meu controler e sim chamar ela de outra classe, no caso minha classe Receive q dai posso criar uma var chamada format q irá informar ao meu sistema qual o formato de dado q eu desejo para minha requisição

 

meu cod ta assim:

View

class View {
protected $class_name;

function __construct($class_name = null){
	$this->class_name = $class_name;
}

public function toXml($data){
	$xml = new SimpleXMLElement('<root/>');
	array_walk_recursive($data, array($xml, 'addChild'));
	echo $xml->asXML();
}
public function toJson($data){
	echo json_encode($data);
}
public function varDump($data){
	var_dump($data);
}
}

UsuarioView

class UsuarioView extends View{}

Controller

class Controller {
protected $Model;
protected $View;

function __construct(){
	@session_start();
}
public function postParams(){
	$params = null;

	if(isset($_POST)) 
		foreach($_POST as $key => $val)
			if($key != 'submit') $params[$key] = $val; 		

	return $params;
}
public function getParams(){
	$params = null;
	if(isset($_GET)) foreach ($_GET as $key => $val) $params[$key] = $val;
	return $params;
}	
}

UsuarioCtrl

class UsuarioCtrl extends Controller{

function __construct(){
	$this->Model = new UsuarioModel();
	$this->View = new UsuarioView();
	parent::__construct();
}

public function setSession($Usuario){
	$_SESSION['usuario'] = $Usuario;
}

public function login(){		
	//Recebe Dados
	$params = parent::postParams();

	$email = isset($params['email']) ? $params['email'] :null;
	$senha = isset($params['senha']) ? $params['senha'] :null;

	//set model
	$email = $this->Model->setEmail($email);
	$senha = $this->Model->setSenha($senha);

	//verifica erro
	$error = null;
	if(!$email) $error[] = $email;
	if(!$senha) $error[] = $senha;

	//imprime erro se existir
	if(is_array($error)){
		echo 'erro validacao';
		$this->View->toJson($error);
		exit(1);
	}

	//query para seleção 
	$sql = "SELECT * FROM Usuario WHERE Usuario.email= '".$this->Model->getEmail()."' AND Usuario.senha= MD5('".$this->Model->getSenha()."');";


	//inicia conex DB
       $Mypdo = new MyPDO();
       $result = $Mypdo->query($sql);

       //FetchObj Result
       $Usuario = $result->fetchAll(PDO::FETCH_CLASS,'UsuarioModel');

	//verifica resultado se vazio show error se não set
	if(empty($Usuario)){
		$error[] = array('error'=>utf8_encode('E-mail e/ou senha inválidos'));
	}else $this->setSession($Usuario[0]);

	if(is_array($error)) $this->View->toJson($error);
	else $this->View->toJson(1);
}

public function logout(){
	try{
		if(!session_destroy()) throw new myErrorException('Não foi possivel realizar o logout');
	}catch (myErrorException $e){
		$this->View->toJson($e->getMessage());
	}
}

public function verificaLogado(){	
	if(!isset($_SESSION['usuario'])) $this->View->toJson(false);
	else $this->View->toJson(true);
}
}

UsuarioModel

class UsuarioModel {
public $id;
protected $permissao_id;
protected $email;
protected $senha;

public function getId() {
	return $this->id;
}


public function getPermissao_id() {
	return $this->permissao_id;
}

public function getEmail() {
	return $this->email;
}

public function getSenha() {
	return $this->senha;
}

public function setId($id) {
	if(!is_numeric($id)) return false;
	else $this->id = $id;
	return true;
}

public function setPermissao_id($permissao_id) {
	if(!is_numeric($permissao_id)) return false;
	else $this->permissao_id = $permissao_id;
	return true;
}

public function setEmail($email) {
	$Validate = new Validate();
	if($Validate->email($email)){
		$this->email = $email;
		return true;
	}else return array('error'=>utf8_encode('E-mail Inválido'));	
}

public function setSenha($senha) {
	$Validate = new Validate();
	if(!$Validate->length('min', 5,strlen($senha))) return array('error'=>utf8_encode('Senha inválida, mínimo de 5 caracteres'));
	if(!$Validate->length('max', 32,strlen($senha))) return array('error'=>utf8_encode('Senha inválida, máximo de 32 caracteres'));
	$this->senha = $senha;
	return true;
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ficou melhor, claro, mas ainda não está certo.

 

Como eu disse no post #12, a View não mostra dados, ela monta a Resposta que será enviada. Na prática, o que você limita sua View a apenas suportar XML e JSON.

 

O que acontece se amanhã ou depois você precisar, por algum motivo, de texto plano ou uma planilha do Excel, que nada mais é do que um layout HTML 4 exibido após o cabeçalho apropriado ter sido enviado?

 

Você vai ter que mexer na View. Se só os Usuários precisarem desse novo recurso, você vai mexer em UsuariosView, se não, se para todos, na View "base".

 

Olha como ficaria muito melhor dessa forma, parcialmente baseado no meu sistema:

 

class MyController extends AbstractController {

   public function index() {

       $model = new Model( Registry::getInstance() -> connection -> getConnection() );

       $this -> view -> data = $model -> getSomeData() -> fetchAll();

       $this -> view -> render( sprintf( 'users/profile/%s.phtml', $_GET['format'] ) );
   }
}

A título de exemplificação, não importa quem são meu AbstractController, Model, Registry ou meu DB Adapter, mesmo porque esse esquema não segue à risca a forma como faço.

 

Também vamos desconsiderar a falta de tratamaneto de $_GET['format']. Meu sistema não utiliza tal variável diretamente, mas o tratamento recebido, não vêm ao caso.

 

O que importa aqui é meu método View::render() que vai montar a resposta baseado na escolha de formato de output do usuário.

 

Ela vai informar à uma outra classe minha, Response, que o Template View a ser renderizado será o nome do formato de output desejado seguido da extensão .phtml.

 

Hoje eu poderia ter nesse subdiretório, json.phtml e xml.phtml.

 

Amanhã, se eu quisesse fornecer uma saí em texto plano, bastaria criar, por exemplo, um plain.phtml, colocar nesse diretório e pronto.

 

Outra coisa... Sua View carece da parte mais vital de uma View, as Template Variables.Sem elas você não consegue, pelo menos não de forma correta, passar os dados que a Model passou ao Controller para View.

 

No exemplo acima, na minha View, eu faço através do método mágico __set() que cria a variável data em tempo de execução, mas eu também possa invocar o referido método View::assign():

 

$this -> view -> assign( 'data', $model -> getSomeData() -> fetchAll() );

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.