Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida em POO (Hydrate)

Olá meus caros, tudo bem? Estou em dúvida de como posso proceder para uma solução melhor no projeto de estudo que estou desenvolvendo. Temos o seguinte desenho. UML do projetoColoquei dessa forma pois um usuário poderá ter mais de uma permissão de acesso das funções do sistema. Foram criadas as classes e as entidades dos bancos.

<?php
namespace LyraMaker\SistemaLogin\Model;

use ArrayObject;

class User
{
   private string $id;
   private string $nome;
   private string $senha;
   private string $email;
   private array $acesso;

   public function __construct(string $id, string $nome, string $senha, string $email)
   {
      $this->setId($id);
      $this->setNome($nome);
      $this->setSenha($senha);
      $this->setEmail($email);
      $this->acesso = [];
   }
   public function setID(string $id)
   {
      $this->id = $id;
   }
   public function setNome(string $nome)
   {
      $this->nome = $nome;
   }
   public function setSenha(string $senha)
   {
      $this->senha = $senha;
   }
   public function setEmail(string $email)
   {
      $this->email = $email;
   }
   public function setAcesso(Permission $acesso)
   {
      if (!in_array($acesso, $this->acesso)) {
         array_push($this->acesso, $acesso);
         return;
      }
      return;
   }
   public function getId()
   {
      return $this->id;
   }
   public function getNome(): string
   {
      return $this->nome;
   }
   public function getSenha(): string
   {
      return $this->senha;
   }
   public function checkSenha(string $senha): bool
   {
      return password_verify($senha, $this->getSenha());
   }
   public function getEmail(): string
   {
      return $this->email;
   }
   public function getAcesso(): array
   {
      return $this->acesso;
   }
}
<?php
namespace LyraMaker\SistemaLogin\Model;

class Permission
{
    private string $id;
    private string $nome;
    private ?string $descricao;
    private string $dataCriacao;

    function __construct(string $id, string $nome, ?string $descricao, string $dataCriacao)
    {
        $this->setId($id);
        $this->setNome($nome);
        $this->setDescricao($descricao);
        $this->setDataCriacao($dataCriacao);
    }
    public function setId(string $id)
    {
        $this->id = $id;
    }
    public function setNome(string $nome)
    {
        $this->nome = $nome;
    }
    public function setDescricao(?string $descricao)
    {
        $this->descricao = $descricao;
    }
    public function setDataCriacao(string $dataCriacao)
    {
        $this->dataCriacao = $dataCriacao;
    }
    public function getId()
    {
        return $this->id;
    }
    public function getNome()
    {
        return $this->nome;
    }
    public function getDescricacao()
    {
        return $this->descricao;
    }
    public function getDataCriacao()
    {
        return $this->dataCriacao;
    }
}

E a classe Repository do user

<?php
namespace LyraMaker\SistemaLogin\Repository;
use LyraMaker\SistemaLogin\Helper\Connection;
use LyraMaker\SistemaLogin\Model\User;

class RepositoryUser
{
    private $pdo;

    public function __construct()
    {
        $this->pdo = (new Connection())->open();
    }
    public function register(User $user)
    {
        $sqlInsert = "INSERT INTO User (id,nome,senha,email,acesso) VALUES (:id,:nm,:snh,:ml,:css)";

        $stmnt = $this->pdo->prepare($sqlInsert);

        $stmnt->bindValue(":id", $user->getId());
        $stmnt->bindValue(":nm", $user->getNome());
        $stmnt->bindValue(":snh", $user->getSenha());
        $stmnt->bindValue(":ml", $user->getEmail());
        $stmnt->bindValue(":css", $user->getAcesso());

        $stmnt->execute();

    }

    public function viewAll(): array
    {
        $userList = $this->pdo
            ->query('SELECT * FROM User;')
            ->fetchAll(\PDO::FETCH_ASSOC);
        return array_map(
            $this->hydrate(...),
            $userList
        );
    }

    public function findById($id)
    {
        $sql = "SELECT id,nome,senha,email,acesso FROM user WHERE id = $id";
        $data = $this->pdo->query($sql)->fetch(\PDO::FETCH_ASSOC);

        return $this->hydrate($data);
    }

    public function hydrate(mixed $allData): ?User
    {
        if($allData !== false){
        $user = new User($allData['id'], $allData['nome'], $allData['senha'], $allData['senha']);
        $user->setAcesso($allData['acesso']);
        return $user;
        }
        return null;

    }
}

Gostaria que os valores das permissões ficassem todos juntos no atributo acesso da class user. Só que os valores repetidos estão ficando únicos, em índices diferentes na array final, o que posso fazer?

2 respostas
solução!

Oii, Gabriel.

Isto está ocorrendo quando você deseja buscar todos os dados dos usuários com suas permissões viewAll()?

Já tentou fazer algo parecido com o que é mostrado nesta aula?

https://cursos.alura.com.br/course/php-pdo-banco-de-dados/task/72945

Obrigado pela ajuda. Solucionou o que buscava.