Ir para conteúdo

POWERED BY:

Arquivado

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

criatividade zero

[Resolvido] mvc de novo

Recommended Posts

to quebrando a cuca direto por causa disso...

 

o View fica responsavel pela parte visual do projeto

o Ctrl define o que aparece na View...

 

 

então simulando um caso para usuario logado e deslogado em uma determinada pagina de um post de blog.

i. o controller consulta a model para retornar os dados do post e os comentários

ii. o view exibe os dados

----------

se o usuario estiver logado, eu preciso fazer uma consulta, ex

if (logado){
  consulta('alguma coisa');
}

essa consulta seria o controller requisitando uma model, correto?

 

 

 

[view]

esse resultado da consulta eu exibo na view, mas seria necessário algo do tipo

if (logado){
  exibe('consulta_alguma_coisa');
}else{
  exibe('voce esta deslogado');
}

 

 

 

essas verificações acabam sendo repetitivas d+

nao seria mais pratico ter no ctrl algo tipo para passar a função montada para a view?

if (logado){
  consulta('alguma coisa');
  valor = exibe('consulta_alguma_coisa');
}else{
  valor = exibe('voce esta deslogado');
}

 

 

 

ja estou meio enrolado

Compartilhar este post


Link para o post
Compartilhar em outros sites

essa consulta seria o controller requisitando uma model, correto?

 

Exatamente...

 

Quando alguém acessa sua aplicação, seja clicando em um link ou digitando diretamente o endereço dela, a primeira coisa que ocorre, ocorre no Controlador.

 

MVC-Sequence.png

 

Quando a requisição chega, o controlador vai decidir o que fazer com ela, vai ver se é necessário recuperar alguma informação e qual o tipo adequado de resposta ao usuário.

 

Imagine que o usuário entrou em uma área da aplicação em que é necessário estar logado para acessar:

 

login-use-case.png

 

Quando o usuário acessar a aplicação ele cairá no controlador que verificará se o usuário está logado:

 


logado = false;

if ( usuario.logado ){
logado = true;
} elseif ( usuario.temCookieDeLogin ){
modelUsuario = new ModelUsuario();
logado = modelUsuario.verificaLogin( usuario.cookieDeLogin );
}

if ( logado ){
modelInformacoes = new ModelInformacoes();
view.mostraInformacoes( modelInformacoes.pegaPosts() );
} else {
view.mostraFormularioDeLogin();
}

 

Na prática, não existe repetição, existe uma verificação que causa a modificação da exibição. A forma que você modelará sua View poderá facilitar ou dificultar as coisas, mas no final, o usuário fará uma requisição, o controlador receberá a requisição e tomará decisões e a view refletirá essa decisão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

logado = false;

if ( usuario.logado ){
logado = true;
} elseif ( usuario.temCookieDeLogin ){
modelUsuario = new ModelUsuario();
logado = modelUsuario.verificaLogin( usuario.cookieDeLogin );
}

if ( logado ){
modelInformacoes = new ModelInformacoes();
view.mostraInformacoes( modelInformacoes.pegaPosts() );
} else {
view.mostraFormularioDeLogin();
}

 

 

eu estava trbalhando com o ctrl acessando a model e repassando dados 'crus' para a view

como array de uma consulta, que no view eu dou loop... e monto o html por inteiro apenas com as informações

 

fiquei na duvida se na 'regra' os dados transitam sem formatação, para serem tratados na view

 

 

no exemplo que você postou, o controller remete à view um valor formatado por uma função

view.mostraFormularioDeLogin();

então o controller repassa à view um HTML!?

é isso mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

view.mostraFormularioDeLogin();

então o controller repassa à view um HTML!?

é isso mesmo?

 

Absolutamente não;

 

Como você deve ter percebido, existem duas chamadas:

 

1.

view.mostraInformacoes( model.pegaInformacoes );

 

2.

view.mostraFormulario();

 

Em nenhum momento, o controlador passou HTML para a View.

 

No primeiro caso, ele passou uma matriz ou um Iterator com os dados, já no segundo caso, ele não passou nada.

 

Como não existem dados para serem recuperados no caso de uma exibição de um formulário de login, o controlador delega a exibição do formulário à View (é ela que montará o html); Já no caso das informações dos posts, o controlador recuperará essas informações da Model que retornará uma matriz ou um Iterator com os dados solicitados, esses dados serão tratados pela Model apenas para que eles estejam de acordo com as regras de negócio, quando o controlador tiver os dados, ele repassa para a View e ela montará a resposta.

 

1. O Controller apenas trata requisições e decide quem manipula a informação e quem exibe a informação.

2. A Model lida com as regras de negócio, é nela que dados de login (e qualquer outro tipo de informação) é validada, manipulada e recuperada.

3. A View lida com exibição, é só e somente só através da View que o usuário visualizará as informações e fará novas requisições (usando formulários, links em menus, etc..)

Compartilhar este post


Link para o post
Compartilhar em outros sites

so não entendi o que seriam essas funções

 

Isso ai é só um pseudo-código, é ilustrativo, só para que se tenha ideia do que o controlador faz.

Compartilhar este post


Link para o post
Compartilhar em outros sites

seria isso?

 

Sim, exatamente isso.

 

 

View

//...

public function mostraInformacoes( Iterator $posts ){
	echo '<ul>';
foreach ( $posts as $post ){
 	echo '<li>' , $post->text , '<br /><strong>' , $post->author , '</strong></li>';
}
echo '</ul>';
}

public function mostraFormulario(){
echo '<form action="/login">';
echo '<label for="name">Usuário: <input id="name" type="text" name="name" /></label>';
echo '<label for="pswd">Senha: <input id="pswd" type="password" name="pswd" /></label>';
echo '<button>Login</button>';
echo '</form>';
}
//...

 

Model:

//...
public function pegaInformacoes(){
$stm = $pdo->prepare( 'SELECT `text`,`author` FROM `Posts` WHERE DATEDIFF( NOW() , `date` ) <= :limite;' );
$stm->bindValue( ':limite' , 10 );
$stm->execute();

return new ArrayIterator( $stm->fetchAll( PDO::FETCH_OBJ ) );
}
//...

 

Controller:

//...

public function handle(){
$view = new View();
$model = new Model();

if ( logado ){
 	$view->mostraInformacoes( $model->pegaInformacoes() );
} else {
 	$view->mostraFormulario();
}
}

//...

Compartilhar este post


Link para o post
Compartilhar em outros sites

então seria isso?

 

class testeView
{
public function telaLogado() {
	echo 'você esta logado';
}

public function telaDeslogado() {
	echo 'você não esta logado';
}

public function mostraPosts( $posts ) {
	echo '<ul>';
	foreach ( $posts as $post ){
		echo '<li>' , $post->text , '<br /><strong>' , $post->author , '</strong></li>';
	}
	echo '</ul>';
}
}


class testeController
{
public function Acao() {
		$model	= new Model();
	$view	= new View();

	/* saida posts */
	$this-> Posts = mostraPosts( $model->Posts() );

	/* saida login */
	if (login == true)
	{
		$this-> Login = telaLogado();
	}
	else
	{
		$this-> Login = telaDeslogado();
	}
}
}

 

 

 

fiquei mais confuso hehehehe

um monte de exemplos que vi, o controller pega os dados da model para usar em uma view dessa forma

view.php

 

echo $this-> data['titulo']

echo $this-> data['texto']

...

 

pelo exemplo que você passou, o controller recupera os dados da model e usa os metodos da classe view

é isso???

Compartilhar este post


Link para o post
Compartilhar em outros sites

então seria isso?

 

Sim, apesar de você ter esquecido de utilizar o objeto que instanciou, você utilizou os nomes dos métodos corretamente.

 

fiquei mais confuso hehehehe

um monte de exemplos que vi, o controller pega os dados da model para usar em uma view dessa forma

view.php

 

echo $this-> data['titulo']

echo $this-> data['texto']

 

Eu não compreendi esse fragmento ai, mas se for o que estou pensando, é um erro gravíssimo, trata-se de violação de encapsulamento e deve ser evitado sempre, ao máximo.

 

pelo exemplo que você passou, o controller recupera os dados da model e usa os metodos da classe view

é isso???

 

Exatamente, não devemos jamais violar o encapsulamento, quando trabalhamos com orientação a objetos, delegamos responsabilidades para outros objetos. No caso do MVC, cada objeto é responsável por uma camada, mas ainda devemos trabalhar exclusivamente sobre as interfaces dos objetos.

 

Imagine o seguinte:

 

UserEntity.php

<?php
/**
* Entidade que representa um usuário
*/
class UserEntity {
/**
 * @var	string
 */
private $userEmail;

/**
 * @var	integer
 */
private $userId;

/**
 * @var	string
 */
private $userName;

/**
 * @param	integer $userId
 * @param	string $userName
 * @param	string $userEmail
 */
public function __construct( $userId , $userName , $userEmail ){
	$this->userId = $userId;
	$this->userEmail = $userEmail;
	$this->userName = $userName;
}

/**
 * Recupera o email do usuário
 * @return	string
 */
public function getEmail(){
	return $this->userEmail;
}

/**
 * Recupera o ID do usuário
 * @return	integer
 */
public function getId(){
	return $this->userId;
}

/**
 * Recupera o nome do usuário
 * @return	string
 */
public function getName(){
	return $this->userName;
}
}

 

UserModel.php

<?php
/**
* Model de usuários
*/
class UserModel {
/**
 * Recupera um Iterator de usuários
 * @return	ArrayIterator
 */
public function getUserIterator(){
	$userArray = array(
		new UserEntity( 1 , 'Neto' , 'neto@email.com' ),
		new UserEntity( 2 , 'João Neto' , 'joao@neto.com' ),
		new UserEntity( 3 , 'criatividade zero' , 'criatividade@zero.com' )
	);

	return new ArrayIterator( $userArray );
}
}

 

UserView.php

<?php
/**
* View de usuários
*/
class UserView {
/**
 * @var	Iterator
 */
private $userIterator;

/**
 * Finaliza a exibição da View
 */
public function finalize(){
	//faz qualquer coisa para finalizar a View
}

/**
 * Prepara a exibição da View
 */
public function prepare(){
	//faz qualquer coisa para preparar a View
}

/**
 * Define um Iterator de usuários para ser exibido
 * @param	ArrayIterator $userIterator
 */
public function setUserIterator( ArrayIterator $userIterator ){
	echo '<ul>';

	foreach ( $userIterator as $userEntity ){
		echo '<li>';
		echo '<dl><dt>' , $userEntity->getName() , '</dt><dd>' , $userEntity->getEmail() , '</dd></dl>';
		echo '</li>';
	}

	echo '</ul>';
}
}

 

UserController.php

<?php
/**
* Controlador de usuários
*/
class UserController {
/**
 * Manipula a requisição
 */
public function handle(){
	$model = new UserModel();
	$view = new UserView();

	$view->prepare();
	$view->setUserIterator( $model->getUserIterator() );
	$view->finalize();
}
}

 

index.php

<?php
$controller = new UserController();
$controller->handle();

 

Como pode ver, utilizamos os métodos dos objetos para recuperar os dados da Model e para exibir o HTML, como não dependemos da implementação para recuperar os dados e para exibi-los, podemos variar o código e, em vez de ter uma matriz com os dados do usuário, recuperar essa informação do banco de dados.

 

Na prática, não importa de onde estão vindo os dados, não é responsabilidade do controlador ter essa informação, ele conhece o método que recupera a informação que ele quer e sabe também o método correto da View que receberá a informação.

 

Imagine que o usuário esteja acessando a aplicação através de um celular, como não dependemos da forma que a marcação é escrita, podemos variar a View sem afetar o controlador:

 

<?php
/**
* Controlador de usuários
*/
class UserController {
/**
 * Manipula a requisição
 */
public function handle(){
	$model = new UserModel();

	//isso aqui é uma verificação beeeeeeem simplista ;)
	if ( isset( $_SERVER[ 'HTTP_X_WAP_PROFILE' ] ) || isset( $_SERVER[ 'HTTP_PROFILE' ] ) ){
		$view = new UserMobileView();
	} else {
		$view = new UserView();
	}

	$view->prepare();
	$view->setUserIterator( $model->getUserIterator() );
	$view->finalize();
}
}

 

Nosso controlador praticamente não sofreu modificações, nossa Model é exatamente a mesma, porém agora, se o usuário acessar de um celular, ele terá o conteúdo exibido corretamente.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

logo quando postei as 1ªs duvidas, citei que o maior problema são os tutoriais falhos

ja me lasquei aos montes por causa disso, uns mostram uma forma, outros mostram outra...

 

 

então vejamos

class UserController {
       public function handle(){
               $model = new UserModel();
               $view = new UserView();

               $view->prepare();
               $view->setUserIterator( $model->getUserIterator() );
               $view->finalize();
       }
}

 

essa é uma saida - exemplo - de texto simples

como seria a divisão das colunas, menu, topo, rodapé...

se tiver uma coluna central e um menu à esquerda?

 

 

minha view é um php com a estrutura toda dividida e eu vou 'encaixando'; $this-> menu; $this->texto...

 

 

        public function setUserIterator( ArrayIterator $userIterator ){
		return '...';
       }

poderia ser usado como um preparativo para usar no template

 

        public function handle(){
               $model = new UserModel();
               $view = new UserView();

               $view->prepare();
               $view->setUserIterator( $model->getUserIterator() );
               $view->finalize();

               $this->loadTemplate();
       }

 

valeu

:D

Compartilhar este post


Link para o post
Compartilhar em outros sites

minha view é um php com a estrutura toda dividida e eu vou 'encaixando'

 

Em orientação a objetos, esse "encaixando" chama-se agregação ou composição (depende da "dureza" da ligação).

 

Veja esse tópico :seta: http://forum.imasters.com.br/index.php?/topic/402287-vale-a-pena-usar-templates/page__p__1576365entry1576365

Compartilhar este post


Link para o post
Compartilhar em outros sites

heheeheh

ja tinha lido... mais cedo fiz uma nova busca procurando informações

 

 

então esse esboço é válido - forma correta?

no template eu teria a montagem do HTML da pagina e os d+ itens

 

class UserView {
public function Macho(){
	return '<img = chuck norris>';
}

public function Femea(){
	return '<img = meninas super poderosas>';
}
}


class UserController {
public function handle(){
	$model	= new UserModel();
	$view	= new UserView();

	/* suponhamos que esse metodo retorne informações do perfil do usuario */
	$this-> Perfil = $view-> meuPerfil( $model->getUserIterator() );

	if ($this-> Perfil['macho'] == 'm')
	{
		$this-> Theme = $view-> Macho();
	}
	else
	{
		$this-> Theme = $view-> Femea();
	}

	$this->loadTemplate();
}
}

 

valeu de novo João

Compartilhar este post


Link para o post
Compartilhar em outros sites

	/* suponhamos que esse metodo retorne informações do perfil do usuario */
	$this-> Perfil = $view-> meuPerfil( $model->getUserIterator() );

 

:o

 

Amigo, não me leve a mal mas...

 

WTF seu controlador está fazendo recuperando uma informação da view ??????

 

A View apenas, só e somente só, nada além disso, exclusivamente exibe a informação ao usuário.

 

É responsabilidade da Model retornar informações do perfil do usuário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

class UserView {
public function Macho(){
return '<img = chuck norris>';
}

public function Femea(){
return '<img = meninas super poderosas>';
}

 

public function meuPerfil( $data ){

return 'meu nome é - ' . $data['nomeMembro'];

}

}

 

/* suponhamos que esse metodo retorne informações do perfil do usuario */
$this-> Perfil = $view-> meuPerfil( $model->getUserIterator() );

 

faltou o metodo na view

creio que tenha sido esse o mal entendido hhehee

 

meuPerfil é um metodo da view pra mostrar em bloco as informações recebidas do model ($data) ...

jogo em $this-> Perfil para montar com o resto da pagina

Compartilhar este post


Link para o post
Compartilhar em outros sites

faltou o metodo na view

creio que tenha sido esse o mal entendido hhehee

 

Com ou sem método na View, seu controlador ainda está trabalhando com uma informação vinda erroneamente de lá.

 

	if ($this-> Perfil['macho'] == 'm')
	{
		$this-> Theme = $view-> Macho();
	}
	else
	{
		$this-> Theme = $view-> Femea();
	}

 

meuPerfil é um metodo da view pra mostrar em bloco as informações recebidas do model ($data) ...

jogo em $this-> Perfil para montar com o resto da pagina

 

Não é responsabilidade do controlador trabalhar com isso, o controlador vai apenas coordenar o fluxo, como a View será montada é responsabilidade exclusivamente dela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz confusão mesmo na hora de escrever

creio que esse sim tenha sido esse o mal entendido

 

 

$this-> Perfil = $view-> meuPerfil( $model->getUserIterator() );

/* pegando dados do perfil*/

$Perfil = $model->getUserIterator();

$this-> Perfil = $view-> meuPerfil($Perfil);

 

class UserController {
       public function handle(){
               $model  = new UserModel();
               $view   = new UserView();


               /* pegando dados do perfil*/
               $Perfil = $model->getUserIterator();
               $this-> Perfil = $view-> meuPerfil($Perfil);

               if ($Perfil['macho'] == 'm')
               {
                       $this-> Theme = $view-> Macho();
               }
               else
               {
                       $this-> Theme = $view-> Femea();
               }

               $this->loadTemplate();
       }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

depois de toda aula não poderia dar essa mancada ne :)

 

ja li tudo que tem aqui no forum sobre MVC, mas essa explicação foi direta e reta... corrigiu todos os meus erros e tirou minhas duvidas

 

 

obrigadão João

nem sei como agradecer a boa vontade e paciencia

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.