Ir para conteúdo
Entre para seguir isso  
Marcio Vinicius Silva

Validação de dados

Recommended Posts

Pessoal, boa noite!

 

Minha dúvida seria a melhor maneira (ou a mais cabível) para resolver meu problema de validação. Pois bem...

 

Tenho uma classe Acao (Entity\Acao) e um "Storage" (Table\Acao), onde o último faz a lógica com Banco. Minha validação hoje se encontra na Entity da seguinte maneira:

 

 

<?php
namespace Emkt\API\Model\Entity;


use ArrayObject;
use Emkt\API\Model\Filter\Acao as AcaoFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
use Zend\Stdlib\Hydrator\ObjectProperty;


class Acao implements InputFilterAwareInterface
{


    /**
     * Filtro
     * @var \Zend\InputFilter\InputFilterInterface
     */
    private $filter;


    public $emcam_codigo;
    public $emcam_tipo_acao;
    public $emcam_titulo;


    public function setInputFilter(InputFilterInterface $inputFilter)
    {
        $this->filter = $inputFilter;
    }


    public function getInputFilter()
    {
        if (null === $this->filter) {
            $this->filter = new AcaoFilter();
        }
        return $this->filter;
    }


    public function getMessagesError()
    {
        $filter     = $this->getInputFilter();
        $inputError = $filter->getInvalidInput();
        $messages   = array();


        foreach ($inputError as $error) {
            $messages[$error->getName()] = $error->getMessages();
        }


        return $messages;
    }


    public function isValid()
    {
        $filter = $this->getInputFilter();
        $filter->setData($this->getArrayCopy());


        $valid = $filter->isValid();
        if ($valid) {
            $this->getArrayCopy($filter->getValues());
        }


        return $valid;
    }


    public function exchangeArray(array $data)
    {
        $hydrator = new ObjectProperty();
        $hydrator->hydrate($data, $this);
    }


    public function getArrayCopy()
    {
        $toArray = array();
        $toArray['emcam_codigo']    = $this->emcam_codigo;
        $toArray['emcam_tipo_acao'] = $this->emcam_tipo_acao;
        $toArray['emcam_titulo']    = $this->emcam_titulo;


        return $toArray;
    }
}

O problema aqui é quando faço o método UPDATE, porque eu preciso que no POST ele valide todos os campos (tipo e título) da minha Entity Ação e no UPDATE não, ele só deve validar o que for passado.

 

Esse é o trecho de código presente hoje no Storage que faz a validação:

 

 

...

$acaoEntity = new AcaoEntity();
$acaoEntity->exchangeArray($data);
$valid = $acaoEntity->isValid();

if ( ! $valid) {
    $errors = $acaoEntity->getMessagesError();
    return ['erros' => $errors];
}

O método exchangeArray() passa para a Entity os valores de $data, o problema é que mesmo quando esses valores não são passados (No caso do UPDATE) eu preciso que ele valide apenas os dados de $data. Deu pra entender?rs

 

Eu estou pensando em tirar a validação de dentro da Entity e jogar para o Storage, mas não sei se é uma boa opção. O que acham? Alguma ideia diferente?

 

Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
Entre para seguir isso  

  • Conteúdo Similar

    • Por Rodrigo5468
      Boa tarde a todos.
       
      Estou desenvolvendo um sistema de registro para fins de estudos, mas tenho algumas dúvidas e dificuldades até. Estou usando "programação orientada a objetos", e quero validar alguns campos do meu registro, se puderem me auxiliar, será de grande ajuda.
       
      Meu Diretório:
      Projeto1/ ├── backend/ │ ├── classes/ │ │ ├── Register.php ├── index.php Em Register.php tenho o seguinte código para fazer a validação, mas acredito que estou fazendo algo de errado.
      public function setUsername($username) { $sql = "SELECT * FROM $this->table WHERE username = :username"; $stmt = Database::prepare($sql); $stmt->execute(array('username' => $_POST["username"])); if(empty($_POST["username"])) { return "O campo usuário não pode ser vázio."; }elseif(ctype_space($_POST["username"])) { return "Não pode usar apenas espaços no campo de usuário."; }elseif(strlen($_POST["username"] < 3)) { return "É necessário no mínimo 3 (três) caracteres no usuário."; }elseif(strlen($_POST["username"] > 15)) { return "O máximo é de 15 (quinze) caracteres no usuário."; }elseif(preg_match("/^[a-zA-Z0-9]*$/", $_POST["username"] == 0)) { return "O nome de usuário só pode conter letras e números. (sem espaços e sem caracteres epeciais)"; }elseif($stmt->num_rows !== 0) { return "O nome de usuário já está cadastrado em nossos bancos de dados."; }else { $this->username = $username; } } E no index.php tenho o seguinte código, acredito que está certo, mas eu gostaria de mostrar as mensagens de erros que estão no Register.php, como que posso fazer isso?
      $register = new Registers(); if(isset($_POST["cadastrar"])) { $username = $_POST["username"]; $email = $_POST["email"]; $password = $_POST["password"]; $register->setUsername($username); $register->setEmail($email); $register->setPassword($password); if($register->insert()) { return "Usuário cadastrado com sucesso."; } }  
       
      Obrigado pela atenção!
    • Por unnie
      Se alguém estiver lendo, olá! Estou tentando fazer um CRUD e na parte de validação do e-mail, eu recebo um email tudo certinho, entretanto não estou conseguindo fazer o update de um campo do BD que corresponde ao id que informa se o e-mail está verificado ou não ...
       
      O código de verificação de e-mail está abaixo:
      <?php include "dbh.inc.php"; $token = $_GET['token']; $email = $_GET['email']; $idEmail = 1; $sql = "SELECT * FROM users WHERE emailUsers=? AND token=?"; $stmt = mysqli_stmt_init($conn); if(!mysqli_stmt_prepare($stmt, $sql)){ echo"".$email; header("Location: ../header.php?error=sqlerror"); exit(); } else{ mysqli_stmt_bind_param($stmt, "ss", $email, $token); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if($row = mysqli_fetch_assoc($result)){ ############################################################################################## $sql = "UPDATE users SET emailConfirm='$idEmail' WHERE emailUsers='$email' AND token='$token'"; $stmt = mysqli_stmt_init($conn); mysqli_stmt_execute($stmt); echo "".$row['emailConfirm'].$row['emailUsers'].$row['token'].$row['']; ############################################################################################## } if(!mysqli_stmt_affected_rows()>0){ echo"Afetou Linhas"; } else{ echo"Nenhuma Linha Afetada"; } } no e-mail contém um link estilo:
       
      site.com/arquivo.php?email=$email&token=$token
      site.com/arquivo.php?email=oemaildousuario&token=tokendousuario
       
      quando peço que faça o 'echo' do token e e-mail, é imprimido na tela o email e token que estão no link corretamente como eu quero e quando peço 'echo' de outra informação do usuário que contem as informações equivalentes ao do token e email do link as informações são mostradas corretamente também, mas no momento que peço pelo UPDATE nada acontece no BD, o id de validação (emailConfirm) de e-mail continua em '0'  e não faz o update para 1...
       
      alguém pode me ajudar???  Obrigada !
    • Por vonder
      Preciso de validar os campos do "CRIAR LOGIN";
      Armazenar informações em alguma variável ao clicar no botão CADASTRAR; (não pode usar banco de dados)
      validar campos do "LOGIN";
      permitir acesso ao LOGIN se as informações forem iguais as inseridas no CRIAR LOGIN;
       
      Se conseguirem armazenar os cadastros em algum vetor ajudaria dms!

    • Por Vinícius022
      Acho que estou com algum problema de herança ou coisa assim, eu não consigo chamar mais de um Container::getModel no meu Controller. Vou colocar o meu __construct aqui e o erro que ele me retorna

      PaginaController.php
      public function __construct()
      {
        parent:: __construct();
        #se eu comentar e deixar apenas um ai ele funciona, mas quando tento fazer com mais de um ele da um erro
        $this->contato       = Container::getModel("Contato");
        $this->noticia       = Container::getModel("Noticias");
        $this->institucional = Container::getModel("Institucional");
        $this->atuacao    = Container::getModel("Atuacao");
        $this->banner    = Container::getModel("Banners");
      }
      Container.php
      public static function getModel($model)
      {
          $objModel = "\\App\\Models\\".$model;
          return new $objModel(DataBase::getDataBase());
      }
      Fatal error: Uncaught TypeError: Argument 1 passed to Core\BaseModel::__construct() must be an instance of PDO.
    • Por Camille Roberta
      Olá,
       
      estou tendo dificuldades para criar o código de validação de um formulário que abrirá em um popup, o código fica se repetindo causando erro (o erro aparece na tela repetidamente de forma que não é possível preencher os campos). Peço gentilmente a ajuda de vocês.
       
      Código HTML:
       
      <HTML>
             <HEAD>
                        <link rel="stylesheet" href = "css/stylesheet1.css">
             </HEAD>
             <BODY>
      <!-- popup -->
             <div id = "popup" class = "popup">
                     <a>x</a>
                     <h3><center>Inscreva-se em nossa newsletter</center></h3>
                     <p><center>Cadastre-se e fique por dentro de nossos eventos e promoções!</center></p>
                           <form class="form" method= "get" name = "modal_form" onSubmit="return ( verifica() )">
                                <input id="name" name = "nome" type="text" placeholder="NOME" onblur="checar();" />
                                <input id="email" name = "email" type="text" placeholder="nome@email.com" onblur="checar();" />
      <br>
                               <span class = "nao_valido">Email Inválido</span>
      <br>
                               <input id="submit" type="submit" value="Enviar">
      </form>
              <br>
              </div>
       
      Código Javascript
       
      setTimeout(ApresentarPopup, 4000);
      function ApresentarPopup(){
              document.querySelector(".popup").style.display = "block";
              document
                  .querySelector(".popup a")
                  .addEventListener("click", function(){ document.querySelector(".popup").style.display = "none";
                  });
          }
      //validação
      function verifica() {
        if (document.forms[0].email.value.length == 0) {
          alert("Por favor, informe o seu e-mail.");
          document.modal_form.email.focus();
          return false;
        }
        return true;
      }

      function checar(){
          if( document.forms[0].email.value=="" 
              || document.forms[0].email.value.indexOf('@')==-1 
              || document.forms[0].email.value.indexOf('.')==-1 )
             {
              alert( "Por favor, informe um e-mail válido." );
              return false;
          }
          
          if (document.forms[0].nome.value == ""){
              alert ("Por favor, informe seu nome");
              return false;
          }
      }
                   <script type="text/javascript" src="js/script.js"></script>
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.