У меня есть некоторые проблемы с реализацией шаблонов в моем приложении.У меня есть бизнес-классы, которые выполняют бизнес-логику (не представленную в этом коде), классы репозитория, которые извлекают данные из базы данных 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;
}
}
Верны ли мои мысли?Как бы вы это сделали?