Ir para conteúdo

POWERED BY:

Arquivado

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

caio wind

[Resolvido] sistema em mvc

Recommended Posts

Entendi, mas é que fica estranho.

Aparece a tela de login, toda certinha, com css e tudo mais, mas se ele enviar um login e/ou senha inexistente, fica uma tela branca com apenas uma frase, por isso queria aproveitar a tela de login.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso que eu queria saber, nesse meu login.php, eu posso ter codigo php apenas para verificar se o usuario digitou todos os campos, só pra isso?

 

Outra duvida, com relação ao login.php, se eu coloco um codigo assim:

<?php require_once(INCLUDE_MENU_LATERAL_ADMIN); ?>

, apenas para não ficar repetindo em todos os meus arquivos o codigo referente ao menu, está errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

- Eu posso ter codigo php, na tela de login, apenas para verificar se o usuario digitou todos os campos?

 

- Posso utilizar o php dessa maneira:

<?php require_once(INCLUDE_MENU_LATERAL_ADMIN); ?>

Apenas para não ficar repetindo em todas as minhas paginas o codigo referente ao menu, está errado?

 

- Posso fazer isso na minha view.php

echo "<table border='1' id='table_index'>
               <tr>
                   <td width='5' style='border-right: hidden;'></td>
                   <td style='border-right: hidden;'><label for='Nome'><b>Nome</b></label></td>
                   <td style='border-right: hidden;'><label for='Login'><b>Login</b></label></td>
                   <td style='border-right: hidden;'><label for='Email'><b>E-mail</b></label></td>
                   <td style='border-right: hidden;'><label for='Ultimo Acesso'><b>Último Acesso</b></label></td>
                   <td></td>
                </tr>
             </table>";
       $listaDeAdministradores = $administradorDAO->listaAdministradores;

       for($i = 0; $i < count($listaDeAdministradores); $i++){
           echo $listaDeAdministradores[$i]->getNome()."<br />";
       }

Compartilhar este post


Link para o post
Compartilhar em outros sites

View:

class AdministradorView {

   public function getResposta($resposta){

       if($resposta){
           echo 'Login efetuado com sucesso!';
       }
       else{
           echo 'Erro ao efetuar o login. Dados incorretos!';
       }
   }  
}

 

isso aqui esta bem errado, e por sinal, foi uma duvida minha identica quando comecei a estudar MVC

vou dar um passo mais adiante do seu problema, mas você vai sacar

 

 

temos um controller para um artigo, que retorna o campo texto e o campo total_comments

total_comments é uma coluna com o total de comentarios que o artigo recebeu

 

1) seu controller vai fazer:

if total_comments > 0 (para listar todos os comentarios)

2) sua view teria que ter o mesmo if para listar os comentários

if total_comments > 0 (loop para os comentarios)

 

isso é redundante, pior seria em uma tela com varios ifs que seriam duplicados

ficou claro de entender o erro?

 

 

é o controller quem faz a verificação, e nao a view

controller:

       if($resposta){
           echo 'Login efetuado com sucesso!';
       }
       else{
           echo 'Erro ao efetuar o login. Dados incorretos!';
           1 session 2ª tentativa...
           2 session 3ª tentativa...
           3 conta suspensa por 15 minutos
       }

perceba que o controller identifica o que aconteceu, e pode fazer o que preciso for

ex: mostrar um captcha apos algumas tentativas

mas da forma que você fez, na view, isso seria mais errado ainda

Compartilhar este post


Link para o post
Compartilhar em outros sites

é o controller quem faz a verificação, e nao a view

 

Perfeito. :joia:

 

perceba que o controller identifica o que aconteceu, e pode fazer o que preciso for

ex: mostrar um captcha apos algumas tentativas

mas da forma que você fez, na view, isso seria mais errado ainda

 

Só quero deixar claro alguns pontos que as pessoas confundem.

 

:seta: Regras de negócio e controle de fluxo são coisas distintas.

:seta: Não existe nenhum problema em ter PHP na marcação da View, PHP nasceu para ser "embutido" na marcação.

 

gallery_94216_5_6899.png

 

Na imagem acima, vemos as direções das interações entre os participantes:

 

1. Model conversa indiretamente com a View.

2. View conversa diretamente com a Model e indiretamente com o Controller

3. Controller conversa com a Model e com a View.

 

Talvez o grande ponto que confunde as pessoas são as interações indiretas, então vou tentar deixar de forma muito explícita como essas interações ocorrem:

 

gallery_94216_5_30070.png

 

Na imagem acima vemos algumas coisas ocorrendo:

 

1. Usuário pode fazer algumas coisas.

2. Moderador pode fazer as mesmas coisas que o usuário e ainda outras coisas específicas.

 

Quando um usuário quer fazer alguma coisa, ele manda uma mensagem através da View (ex: Clicar no botão Novo tópico)

 

Independentemente de qual mensagem o usuário resolveu tomar, é responsabilidade do Controller interceptá-la e manipulá-la.

 

O grande ponto está em entender o que é, de fato, regra de negócio, veja o diagrama abaixo sobre a criação de um novo tópico:

 

gallery_94216_5_19918.png

 

Como pode ver, cada camada possui uma responsabilidade muito específica, fica claro o que cada parte precisa fazer.

 

O grande ponto são as interações com dados, imagine que tenhamos que exibir uma lista de tópicos. Para montar a marcação dessa lista:

 

1. Controller aciona a Model de tópicos para recuperar a lista com todos os tópicos de uma determinada área.

2. Controller aciona a View de tópicos e repassa essa lista para a View.

3. A View itera sobre a lista e monta a marcação:

 

<?php
//Dentro do controlador
$model = new ModelTopics();
$view = new ViewTopics( $model );

$view->showTopics(); //o controlador que fala para a view exibir os tópicos

 

Quando a ViewTopics receber a instrução para exibir os tópicos, ela irá iterar sobre a listagem:

 

<?php
echo '<ul>';
foreach ( $model->getTopics() as $topic ) {
echo '<li>' , $topic->getTitle() , '</li>';
}
echo '</ul>';

 

Perceba que não verificamos se algum tópico está invisível, se o usuário possui permissão para visualizar algum tópico nem nada, essa verificação é responsabilidade exclusiva da Model :seta: Isso é regra de negócio.

 

Quando a View chamar getTopics() ela já está confiando que a Model irá fazer o trabalho dela, ou seja, se algum tópico não puder ser exibido ao usuário, ele nem deverá ser enviado para a View.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, valeu mesmo pela ajuda de vocês, nem sei com agradecer.

Vou consertar algumas coisas no meu código, baseado nas dicas de vocês.

Vou descrever uma ação passo a passo, só para vocês me confirmarem se eu realmente entendi, por favor.

 

Exemplo login:

O usuario digita a URL do sistema ou clica em algum lugar, aparece o arquivo index.php, que na verdade é o formulário de login

Quando o usuário clicar em LOGAR, o action do form envia para o controller a ação e os dados informados no index.php. Esse controller cria um model e passa os dados para que esta verifique no BD se o usuario existe. O model retorna para o controller o resultado de sua validação (true ou false, por exempplo), o controller então, baseado na resposta da model, envia a view de erro ou de ok para o usuário.

É isso?

 

Nesse exemplo, eu posso no controller redirecionar o usuario para uma nova pagina (um .php) caso esteja tudo certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isso?

 

Jefferson, veja o diagrama que postei.

 

Tente visualizar sua sequencia nesse diagrama, se der certo, então é isso.

 

Já estamos no post #69 do tópico e estou vendo que o tópico está andando em círculos.

 

Vamos tentar ser mais objetivos nas perguntas e ler melhor as dicas dadas, isso otimizará a ajuda e evitará redundâncias.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhorei um pouco meus codigos, acho que agora ficou legal

 

Controller:

case "validarLogin":{

       $administradorModel = new AdministradorModel();
       $administradorModel->validarLogin($_REQUEST["login"], $_REQUEST["senha"]);

       $administradorView = new AdministradorView();        

       if($administradorModel->getRespostaValidacaoLogin()){
           $administradorView->exibirRespostaValidacaoLoginPositiva();          
       }
       else{

       }               
   }

 

Model:

 public function validarLogin($login, $senha){

       $bancoDeDados = new BancoDeDados();
       $bancoDeDados->conectar();

       try
       {
           $sql = "SELECT * FROM administrador WHERE login = '".$login."' AND senha = '".md5($senha)."'";
           $retorno = $bancoDeDados->executarQuery($sql);

           if (mysql_num_rows($retorno) > 0){

               /*$administrador = new Administrador();
               $administrador->setNome("Jefferson_jj");
               $administrador->setLogin("Jefferson_jj");
               $administrador->setSenha("Jefferson_jj");
               $administrador->setEmail("Jefferson_jj");*/

               //$criarSessao = new CriarSessao();
               //$criarSessao->criarSessaoAdmin($administrador);

               $this->atualizarAcesso($login);

               $this->setRespostaValidacaoLogin(true);
           }
           else{
               $this->setRespostaValidacaoLogin(false);
           }
       }

 

View:

public function exibirRespostaValidacaoLoginPositiva(){

           header ("Location: ../admin/home.php");     
   }

 

Só uma duvida, com relação ao login, o controller que criaria a sessão e colocaria alguns dados?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhorei um pouco meus codigos, acho que agora ficou legal

 

Controller:

 

Tão errado quanto ter regras de negócio na View, é ter regras de negócio no Controller e seu Controller possui regras que deveriam estar na Model.

 

Tente ser menos específico no Controller, em vez de verificar passo a passo uma coisa, deixe isso para o Model e veja apenas o resultado:

 

if ( $model->validaLogin() ) { 
//login válido
} else {
//login inválido
}

 

View:

 	
header ("Location: ../admin/home.php");

 

Não é responsabilidade de View fazer isso, quem deveria tê-lo feito é o Controller.

 

Só uma duvida, com relação ao login, o controller que criaria a sessão e colocaria alguns dados?

 

Sessão, persistência, etc é responsabilidade da Model, não do Controller.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é o controller quem faz a verificação, e nao a view

 

Perfeito. :joia:

 

valeu professor :)

essa duvida você que me explicou a algum tempo era exatamente o mesmo caso

 

o camada View possui ifs, loops... isso é inevitavel, mas o caso dele era redundancia como o meu erro inicial

acho que fez-se confusão ao falar em view não-burra (inteligente)

de fato, a view é uma camada inteligente, como todas as outras, porem é uma camada que 'arruma'

 

 

a view não faz nada, apenas mostra

header ("Location: ../admin/home.php"); pode ser entendido como uma ação, então nao é para a view fazer isso

se existe um redirecionamento, entende-se que não ha nada para mostrar, APENAS, se você tiver um redirecionamento em js mostrando: página errada, você será redirecionado em 5 segundos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que agora foi

 

No controller eu apenas recebo o retorno do model:

case "validarLogin":{

       $administradorModel = new AdministradorModel();        
       $administradorView = new AdministradorView();        

       if($administradorModel->validarLogin(
               $_REQUEST["login"],
               $_REQUEST["senha"])){

           header ("Location: ../admin/home.php");
       }
       else{
           $administradorView->exibirValidacaoLoginNegativa();
       }               
   }

 

No model eu verifico no BD e retorno true ou false e agora vou colocar tudo na sessao, na model

 

Com relação a listagem:

É melhor eu mandar, pelo controller, que a model liste, tipo assim:

case "listarUsuarios":{      

       $administradorModel = new AdministradorModel();
       $administradorModel->listar();

       $administradorView = new AdministradorView();
       $administradorView->exibirListaAdministradores($administradorModel);
   }
   break;

Ou é melhor eu deixar que a view se comunique com a model e pegue a lista, assim:

case "listarUsuarios":{      

       $administradorModel = new AdministradorModel();       

       $administradorView = new AdministradorView();
       $administradorView->exibirListaAdministradores($administradorModel);
   }
   break;

Compartilhar este post


Link para o post
Compartilhar em outros sites

APENAS, se você tiver um redirecionamento em js mostrando: página errada, você será redirecionado em 5 segundos

 

Correto, nesse caso o redirecionamento, por ser feito em JS, precisa ocorrer no navegador.

 

Contudo, é importante notar que, mesmo ocorrendo no navegador, não é a View que faz o redirecionamento.

 

MVC pessoal, ocorre a todo momento:

 

Na sua barra de endereços do navegador (sim, a barra do próprio firefox, ie, chrome, etc)

 

:seta: A própria barra é chamada de View.

 

Quando você começa a digitar alguma coisa e um popup aparece com sugestões baseadas no histórico, é o Controlador recebendo a ação de digitação do usuário, consultando a Model e recuperando as URLs que são adequadas.

 

Ou seja, quando a aplicação é modelada, MVC também acontece no front-end com o Javascript.

 

Acho que agora foi

 

No controller eu apenas recebo o retorno do model:

 

Agora seu controller ficou adequado. :clap:

 

Siga a mesma linha com o restante da aplicação e você terá feito tudo correto.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jefferson NF, o JBN é o cara que saca das coisas, eu aprendi lendo os topicos relacionados ao MVC

 

você esta quase tentando acertar por adivinhação e isso não contribui para você entender de fato como funciona o MVC

minha sugestão é que você leia tudo que tem sobre o assunto - MVC nao é uma forma pessoal de se fazer, mas sim, uma metodologia de desenvolvimento, quando você captar isso vai sentir aquele 'estalo'

 

 

MVC são 3 camadas

model, view e controll

você SABE realmente o que cada camada faz?

esse é o 1º passo pra entender, caso contrario é dar murro em ponta de faca

 

 

tente aprender MVC usando o proprio MVC... aprenda por etapas

nao de um passo maior que a perna pq depois a confusão é maior ainda - experiencia propria com exemplos errados

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pelas dicas e pela ajuda.

 

Eu sei como isso tudo funciona na teoria, na prática é bem diferente, estou lendo bastante coisa. Vi as videos aulas recomendada aqui mesmo, li o blog do Andrey, peguei até um exemplo dele. Leio e releio esse topico, principalmente, no começo, onde é explciado, bem na teoria, a função de cada camada.

 

mas agora bastante coisa ficou esclarecida, principalmente, depois da intervençã do João nesse topico. Ja estou conseguindo entender muito melhor as coisas e até ver alguma coisas funcionando e no padrão MVC. Só que algumas duvidas, bobas, as vezes, como essa da função list, aparecem e esse tipo de duvida voce nao encontra em nenhum material por aí.

 

Mas valeu mesmo pela ajuda e pelas dicas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só que algumas duvidas, bobas, as vezes, como essa da função list, aparecem e esse tipo de duvida voce nao encontra em nenhum material por aí.

 

Essa dúvida do list foi respondida no post #67 por antecipação. Leia esse post com calma, deguste cada vírgula, teste exaustivamente, quebre a cabeça, volte a testar.

 

Lá no final do post #67 tem a resposta para a questão da lista :seta: http://forum.imasters.com.br/topic/438854-sistema-em-mvc/page__view__findpost__p__1737562

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.