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

Yes ! na verdade, o DAO não faz parte do MVC, essa parte de acesso ao banco é na Model, o view tem dependência e associação com ele por causa disso, mas dá pra usar a Model como value object !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andrey, valeu pela ajuda.

 

Essa teoria eu até acompanho e entendo. O problema é colocar na prática, como passar parametros pela url, como chamar a view, etc. Estou olhando as videos aulas recomendadas acima, mas confessor que já estou ficando perdido. No começo entendi muito bem, depois começou a ficar complexo e não estou mais conseguindo acompanhar as video aulas e assimilar ao meu projeto. Mas mesmo assim, valeu mesmo pela ajuda de vocês.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, estou querendo aprender e fazer um projeto de forma correta. Até porque o projeto que estou iniciando vai ser utilizado para outros clientes depois. O problema é que são muitas coisas, muita porcaria como material de apoio, enfim, são muitas duvidas e pouco tempo. As duvidas sao tantas, fico tao perdido, as vezes, que nem sei explicar exatamente onde é a minha maior duvida. Mas continuo lendo e pesquisando aqui.

 

Valeu pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu ja programo em php ha um bom tempo, ja fiz varios projetos. Mas por esse ser um projeto grande, quis fazer de forma correta e comecei a pesquisar e estudar. Vi que estava fazendo varias coisas erradas e quis mudar. Mas imagina se saio colocando codigo dentro de html, camada de banco de dados chamando html, sem padrao, nem nada, como vou reaproveitar esse projeto para outro cliente. Entendeu? Nao vou ficar 'bem' comigo mesmo, fazendo de qualquer jeito.

 

Voce aconselha a utilização de frameworks para o meu caso? Caso sim, qual?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, voltei.

 

Desculpa o incomodo, mas é que são muitas duvidas.

Depois de ler e pesquisar, consegui fazer algo do meu jeito, bem simples, mas sinto que está faltando alguma coisa e gostaria da opinião de vocês, por favor.

 

arquivo inicial - index.php

<form action="<?=URL_CONTROLE."/AdministradorControle.php";?>" method="post" id="loginForm" name="LoginForm">
                       <br />
                       <fieldset class="quadro_login">
                           <legend> Acesso ao sistema </legend>
                           <br />
                           <table>
                               <tr>
                                   <td rowspan="3">
                                       <img src="<?=URL_IMAGENS_ADMIN;?>/login.png" width="60" />
                                   </td>
                               </tr>
                               <tr>
                                   <td>
                                       <label for="login" accesskey="l">Login:</label>
                                   </td>
                                   <td>
                                       <input type="text" maxlength="80" name="login" id="login"
                                          title="Por favor, informe o login" />
                                   </td>
                               </tr>
                               <tr>
                                   <td>
                                       <label for="senha" accesskey="s">Senha:</label>
                                   </td>
                                   <td>
                                       <input type="password" name="senha" id="senha"
                                          title="Por favor, digite a senha" />
                                   </td>
                               </tr>
                               <tr>
                                   <td colspan="3">
                                       <!-- Com essa ação é que o controle vai saber o que tem que fazer -->
                                       <input type="hidden" name="acao" value="validarLogin" />
                                       <input type="submit" name="logar" value=" Entrar " />
                                   </td>
                               </tr>

 

Controle:

require_once("../config.php");
require_once(DIRETORIO_ENTIDADES."/Administrador.php"); 
require_once(DIRETORIO_DAO."/AdministradorDAO.php");
require_once(DIRETORIO_VISAO."/AdministradorView.php");

$acao = $_REQUEST["acao"];

switch($acao){

   case "incluir":{

   }
   break;

   case "validarLogin":{

       //$administrador = new Administrador();
       $administradorDao = new AdministradorDAO();
       $administradorView = new AdministradorView();

       /*$administrador->setLogin($_REQUEST["login"]);
       $administrador->setSenha($_REQUEST["senha"]);*/

       $resultado = $administradorDao->validarLogin($_REQUEST["login"],$_REQUEST["senha"]);

       /*if($resultado){
           echo "ok";
       }*/

       $administradorView->respostaAutenticacao($resultado);

       //echo $resultado->getLogin();
   }
   break;



   default: return null;   

 

DAO:

public function validarLogin($login, $senha){

       parent::conectar();

       try
       {
           $administrador = new Administrador();

           $sql = "SELECT * FROM administrador WHERE login = '".$login."' AND senha = '".md5($senha)."'";            
           $retorno = parent::executarQuery($sql);

           if (mysql_num_rows($retorno) > 0)
           {
               return true;
               //while($linhas = mysql_fetch_array($retorno))
               //{
                   /*$administrador->setId($linhas["id"]);
                   $administrador->setNome($linhas["nome"]);
                   $administrador->setLogin($linhas["login"]);
                   $administrador->setSenha($linhas["senha"]);
                   $administrador->setEmail($linhas["email"]);
                   $administrador->setUltimoAcesso($linhas["ultimo_acesso"]);*/
                   //$this->carregarAdministradorPeloId($linhas["id"]);
               //}

               //return $administrador;
           }
       }
       catch(Exception $e)
       {
           echo "Erro: ".$e->getMessage();
       }

       parent::desconectar();
   }

 

View:

class AdministradorView {

   public function respostaAutenticacao($resposta){

       if($resposta){
           echo '<p class="blue">Login efetuado com sucesso!</p>';
       }
       else{
           echo '<p class="red">Erro ao efetuar o login. Dados incorretos!</p>';
       }
   }
}

 

 

As minhas duvidas sao as seguintes:

Esta, mesmo que basicamente, no padrao MVC?

Como poderia fazer para que o erro, caso o login não exista, apareça no aquivo index.php? Como que a view poderia mostrar isso, já que fiz um arquivo adminview e outro index.php?

Como poderia fazer um controller mais genérico e automatizado?

 

Desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

post #49,

 

há vários erros básicos como por exemplo, o uso da tag php sem a definiç!ao da linguagem

 

errado:

<?=

 

certo:

 

<?php echo 

 

 

internacionalização

require_once("../config.php");
require_once(DIRETORIO_ENTIDADES."/Administrador.php"); 
require_once(DIRETORIO_DAO."/AdministradorDAO.php");
require_once(DIRETORIO_VISAO."/AdministradorView.php");

$acao = $_REQUEST["acao"];

switch($acao){

está usando termos em português.

utilize sempre na "linguagem universal", o inglês

 

quanto ao MVC, também há várias confusões.

parece estar indo no caminho certo mas ainda sim está muitos erros.

 

 

exemplo

 

view

class AdministradorView {

   public function respostaAutenticacao($resposta){

       if($resposta){
           echo '<p class="blue">Login efetuado com sucesso!</p>';
       }
       else{
           echo '<p class="red">Erro ao efetuar o login. Dados incorretos!</p>';
       }
   }
}

 

a view aparentemente está separada das outras "camadas", mas continua misturando o PHP com a saída, nesse caso o HTML.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pelas dicas.

 

O meu maior problema realmente é a VIEW. O mais interessante seria algo assim: ao inves de colocar esse if com php misturado com html, dentro da view, eu chamaria um html puro com o nome erroLogin.html, caso o retorno fosse false, e se fosse true eu redirecionaria o usuario para a pagina incial do sistema, seria algo assim?

Tirando a view o resto da pra aproveitar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, não tenta reinventar a roda, você está falando de misturar HTML com PHP, isso não tem nada haver uma coisa com a outra, você gasta muito mais processamento fazendo dessa forma que você está querendo, do que seguindo a regra do negócio e como ele deve realmente ser. Você viu meu exemplo ? viu como eu fiz ? o VIEW é pra exibir o HTML, seja lá qual tag que for, ela é responsável por isso, o objetivo dela é isso, imprimiu o html pro usuário, acabou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

post #51,

 

sim, é exatamente isso o conceito da camada "view"

 

claro que não pode ser uma "view burra", você pode usar sintaxes simples como os controles de fluxo IF, ELSE, WHILE, etc..

 

o que não é correto é escrever objetos ou chamar funções, métodos, etc, dentro da view, porque aí perde o sentido.

 

há situações onde será mais cômodo usar algum objeto, nesse caso são os chamados HELPERS, por exemplo "form helper" para ajudar a construir e manipular formulários.

também utilize helpers para construir os links, etc...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao refiz algumas coisas no meu codigo, segundo as dicas de voces. Resumidamente, ficou assim:

<form action="<?php echo URL_CONTROLLER."/AdministradorController.php";?>" method="post" id="loginForm">
      <input type="hidden" name="acao" value="validarLogin" />
      <input type="submit" name="logar" value=" Entrar " />

 

Controller:

case "validarLogin":{

       //$administrador = new Administrador();
       $administradorDao = new AdministradorDAO();

       $resultado = $administradorDao->validarLogin($_REQUEST["login"],$_REQUEST["senha"]);

       $administradorView = new AdministradorView();
       $administradorView->getResposta($resultado);

   }

 

View:

class AdministradorView {

   public function getResposta($resposta){

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

 

É mais ou menos isso?

 

Lendo as respostas que voces deram ao meu ultimo post, surgiram algumas duvidas, eu poderia colocar codigo HTML nessa minha view então, ou é melhor eu validar se o login existe e redirecionar para um arquivo HTML?

Outra duvida: no inicio desse topico André Silva coloca esse codigo no controller

$view->load('v_cliente.php', $resCliente); 

Como eu poderia implementar esse metodo load?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quase !

View está quase certinha, porem você pode melhorar isso aí, se você sabe qual objeto vai fornecer a resposta, e se você implementa uma view própria pra cada tabela, ou pra cada módulo, você pode fazer um Type Hinting no método que recupera a resposta de tal objeto.

 

Ao invés de fazer dessa maneira:

public function getResposta($resposta){

 

Você faz:

public function getResposta( AdministradorDAO $resposta ){

 

No controlador, na hora que você chama esse método, você provavelmente está retornando boolean, pra ficar melhor, você pode fazer o seguinte,

public function getResposta( AdministradorDAO $resposta ){

 

Então, crie uma propriedade no AdministradorDAO, com o nome loginResponse, assim você recebe o objeto, e acessa diretamente essa propriedade. o método que valida o Login, vai colocar o valor lá

$this->loginResponse = true; // login ok, ou então false se a autenticação não for válida.

 

Exemplo:

<?php
       class AdministradorDAO{
             /**
              * Guarda a resposta quando o método
              * de validar o login do administrador
              * for executado
              * @var Boolean | String
              */
             public $loginResponse;
             /**
              * Valida o login do administrador
              * @param String | Integer $Login
              * @param String | Integer $Senha 
              */
             public function validaLogin( $Login, $Senha ){
                    /**
                     * ....
                     * SELECT ...
                     * if( .. número de linhas ) != 0 ...
                     */
                     $this->loginResponse = true;
                     /**
                      * Número de linhas = 0 ?
                      */
                     $this->loginResponse = false;
             }

       }

 

Então, na view, nos teríamos o seguinte:

<?php
       class AdministradorView{
             /**
              * Recupera a resposta do login efetuado
              * pelo usuário, ou pelo administrador do sistema
              * @param AdministradorDAO $AdministradorDAO 
              */
             public function getLoginResponse( AdministradorDAO $AdministradorDAO ){
                    if( $AdministradorDAO->loginResponse == true ){
                        /**
                         * ...
                         */
                    }else{
                        /**
                         * ...
                         */
                    }
             }

       }

 

Entendeu ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, Andrey.

 

Só não entendi como mudaria o controller.

 

DAO:

public function getLoginResponse() {
       return $this->loginResponse;
   }

   public function setLoginResponse($loginResponse) {
       $this->loginResponse = $loginResponse;
   }

public function validarLogin($login, $senha){

       parent::connect();

       try
       {
           $administrador = new Administrador();

           $sql = "SELECT * FROM administrador WHERE login = '".$login."' AND senha = '".md5($senha)."'";            
           $retorno = parent::executeQuery($sql);

           if (mysql_num_rows($retorno) > 0){
               $this->setLoginResponse(true);              
           }
           else{
               $this->setLoginResponse(false);
           }
       }
       catch(Exception $e)
       {
           echo "Erro: ".$e->getMessage();
       }

       parent::disconnect();
   }

 

View:

public function getLoginResponse(AdministradorDAO $administradorDAO){

       if($administradorDAO->getLoginResponse() == true){
           //echo 'Login efetuado com sucesso!';
           header ("Location: ../admin/home.php");
       }
       else{
           echo 'Erro ao efetuar o login. Dados incorretos!';
       }
   }

 

Não entendi como no controller eu vou passar um objeto dao para esse metodo getLoginResponse da view.

Assim está dando erro:

//$administrador = new Administrador();
       $administradorDao = new AdministradorDAO();

       //$resultado = $administradorDao->validarLogin($_REQUEST["login"],$_REQUEST["senha"]);
       $administradorDao->validarLogin($_REQUEST["login"],$_REQUEST["senha"]);

       $administradorView = new AdministradorView();
       //$administradorView->getResposta($resultado);
       $administradorView->getLoginResponse($administradorDAO);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem erro de variáveis aí .. lembra do case sensitive. antes de você editar seu post, você perguntou sobre o controller em class, você pode fazer assim:

<?php
       class AdministradorController{
             /**
              * Guarda a ação desejada, para ser executada
              * @var String
              */
             protected $action;
             /**
              * Verifica se tem uma requisição
              * para o controlador atual.
              * Verifica se essa requisição vai ser chamado
              * um método, então executa o método de acordo
              * com o método passado atravês da url
              */
             public function __construct(){
                    if( $this->hasControllerRequest( get_class( $this ) ) ){
                        if( $this->hasRequestAction() ){
                            echo $this->__call( $this->action, func_get_args() );
                        }else{
                            /**
                             * ....
                             */
                        }
                    }
             }
             /**
              * Verifica se há requisição para esse controlador
              * @param String $Controller
              * @return Boolean
              */
             public function hasControllerRequest( $Controller ){
                    if( !is_null( $Controller ) ){
                        if( isset( $_REQUEST[ 'ctrl' ] ) ){
                            if( strtolower( $_REQUEST[ 'ctrl' ] ) 
                                == strtolower( str_replace( 'Controller', null, $Controller ) ) ){
                                return true;
                            }
                        }
                    }
             }
             /**
              * Verifica se houve chamada de alguma ação
              * @return Boolean
              */
             public function hasRequestAction(){
                    if( isset( $_REQUEST[ 'action' ] ) ){
                        $this->action = $_REQUEST[ 'action' ];
                        return true;
                    }
             }
             /**
              * Verifica se a ação desejada existe 
              * nesse controlador
              * @return Boolean
              */
             public function getRequestAction(){
                    $ReflectionObject = new ReflectionClass( get_class( $this ) ); 
                    if( $ReflectionObject->getMethod( $this->action ) ){
                        return true;
                    }
             }
             /**
              * Chama um método a ser executado
              * @param String $Method
              * @param String $Arguments
              * @return String|Integer|Boolean|Double|Float ~
              */
             public function __call( $Method, $Arguments = NULL ) {
                    if( !is_null( $Arguments ) && !count( $Arguments ) ){
                        return $this->$Method();
                    }else{
                        return call_user_func_array( Array( &$this, $Method ), $Arguments );
                    }
             }
             /**
              * Função implementada para teste
              * @param String|Integer $a
              * @param String|Integer $b 
              */
             public function select(){ 
                    echo '<pre>';
                    print_r( func_get_args() );
             }
       }
       $Controller = new AdministradorController( 'parâmetro1', 'parâmetro2', 'parâmetro3' );

Saída:

Array
(
   [0] => parâmetro1
   [1] => parâmetro2
   [2] => parâmetro3
)

 

Mas isso é coisa que raramente você vai precisar, não é legal enviar os valores dos dados por parâmetro.

o legal é pegar direto no método. já que o contexto pro método atual se torna global.

 

Minha url ficou assim:

http://127.0.0.1/?ctrl=Administrador&action=select

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andrey, era por causa do DAO ao inves de Dao, key senstive mesmo

 

Se eu fizer isso na view:

header ("Location: ../admin/index.php?erro=login");      

Está errado né?

 

Pois vou ter que fazer isso no index.php:

<td colspan="3" align="center">
<?php
   $erro = $_REQUEST['erro'];
   if($erro != "")
   {
      echo 'Por favor, preencha o campo '.$erro;
    }
?>
</td>

 

Se esse meu exemplo acima estiver totalmente errado, então como posso mostrar para o usuário o erro na mesma tela onde ele me enviou os dados?

 

Exemplo: login, pego os dados do login.php e envio para o controller, faço todas as validações e mando a view dar um echo, assim não vai mostrar o erro no login.php.

Entendeu?

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.