PHP репозиторий и дизайн фабрики - PullRequest
0 голосов
/ 06 июля 2018

У меня есть некоторые проблемы с реализацией шаблонов в моем приложении.У меня есть бизнес-классы, которые выполняют бизнес-логику (не представленную в этом коде), классы репозитория, которые извлекают данные из базы данных mysql, используя слой постоянства, абстрагированный с интерфейсом DataSource, и классы Factory для создания объектов.У меня вопрос, как и где создать экземпляр объекта Client с его отношениями (Transporte, Direccion и т. Д.)?В хранилище или в заводском классе?Я мог бы использовать другой репозиторий для класса Transporte, чтобы получить его данные и затем загрузить их в объект клиента.

Бизнес-объекты.

tercero.php

abstract class Tercero
{
    protected $id;
    protected $nombre;
    protected $apellido; 
    protected $email ; 
    protected $direccion;
    protected $fecha_alta;
    protected $usuario_alta; 

    public function __construct($id = null, $nombre, $apellido, $email, Direccion $direccion)
    {
        $this->id = $id;
        $this->nombre = $nombre;
        $this->apellido = $apellido;
        $this->email = $email;
        $this->direccion = $direccion;
    }

    function setId($id)
    {
        if (!isset($this->id)) {
            $this->id = $id;
        }
    }     

    public function getId()
    {
        return $this->id;
    }

    /* Setters & Getters of other properties */
}

client.php

class Cliente extends Tercero
{
    protected $transporte;

    public function __construct($id = null, $nombre, $apellido, $email, Direccion $direccion)
    {
        parent::__construct($id, $nombre, $apellido, $email, $direccion);        
    }


   public function setTransporte(Transporte $transp)
   {
       $this->transporte = $transp;
   }

   public function getTransporte()
   {
       return $this->transporte ;
   }

}

Репозитарий классов.repocliente.php

class RepoCliente
{
    private $ds;
    private $factoria;

    public function __construct(DSOps $ds)
    {
        $this->ds = $ds;
        $this->factoria = new FactoriaCliente();
    }

   /*
    * @return array
    */
    public function buscarPorId($id)
    {           
        $datos = $this->ds->leer($id);         

        if ( !$datos ) { 
            throw ClienteNoEncontradoException::busquedaPorId($id);
        }

        /* Should I sent only client data to Factory? Or all client related data so factory class manages itself to relate it? */
        /* It's neccesary in my design using Factory class for object creation? */
        /* If I have to instantiate an object with other objects related to it, how can I do it? */
        $obj = $this->factoria->crear($datos);
        return $obj;
    }

  /*
    * @return obj
    */
    public function guardar(Cliente $obj)
    {        
        /* Data mapping omitted */
        $datos = $obj;

        $saved = $this->ds->guardar($datos);
        return $saved;
    }

}


class FactoriaCliente implements Factoria
{
    function crear($datos)
    {
        $obj_provincia = new Provincia($datos["provincia_id"], 
            $datos["provincia_nombre"]);
        $obj_localidad = new Localidad($datos["id_localidad"], 
            $datos["localidad_nombre"], $obj_provincia);        
        $obj_dire = new Direccion($datos["direccion"], $obj_localidad);
        $obj_transporte = new Transporte($datos["id_transporte"], 
            $datos["transporte_nombre"], $datos["transporte_apellido"]);
        $obj = new Cliente($datos["id"], $datos["nombre"], 
            $datos["apellido"], $datos["email"], $obj_dire);
        $obj->setTransporte($obj_transporte);
    }
}

MySQL Data Source Client.

dsclientemysql.php

class DSClienteSql implements DSOps
{
    private $bd; 

    public function __construct( PDO $bd)
    {
        $this->bd =  $bd;
    }

    /*
    * @return array/false
    */
    public function leer($id)
    {

        /* OPTION 1: Retrieve client data only. Then I have to use separate repository for retrieve client related data and associate it manually */
        $this->query = "SELECT * FROM clients a WHERE id = :id;";

        /* OPTION 2: Retrieve all client related data  so factory can then associate it to client */ 
        $this->query = "SELECT a.*, 
        c.nombre as localidad_nombre, 
        d.id as provincia_id, d.nombre as provincia_nombre,
        e.nombre as transporte_nombre, e.nombre as transporte_apellido, 
        e.nombre as transporte_email
        FROM cliente a
        INNER JOIN localidad c ON a.id_localidad = c.id
        INNER JOIN provincia d ON c.id_provincia = d.id
        LEFT JOIN tercero e ON (a.id_transporte = e.id AND 
            a.id_transporte IN (SELECT id_transporte FROM  tercero_transporte))
        WHERE a.id = :id;";

        $stmt=$this->bd->prepare($this->query);
        $stmt->bindValue(':id', $id);
        $stmt->execute();
        $result = $stmt->fetch(PDO::FETCH_ASSOC);  
        $stmt->closeCursor();

        return $result;
    }

}

Верны ли мои мысли?Как бы вы это сделали?

...