En nuestro desarrollo, vamos a crear Modelos, que son las clases que representan a nuestras tablas en la memoria. Cada tabla tendra su nodelo, con los datos con los que trabajamos

Cuando estas desarrollando un sistema que accede a una base de datos, uno de los patrones de que dispones, es el DAO.

En ese patrón, los modelos son representaciones exactas de las tablas que únicamente contienen datos, y no aportan mas métodos que los estrictamente necesarios para cargar y descargar esos datos.

Para mi, es un patrón que me gusta, aunque… pienso que seria interesante que incorporase algun método mas, y que normalmente voy a necesitar en todos los modelos

El establecer un modelo base, y hacer que todos los modelos extiendan de él, me aporta algunas ventajas muy interesantes

Primero, que puedo poner nombres controlados a los métodos comunes, para que puedan ser llamados siempre igual, naturalmente, que en el base. deberán ser abstractos, y los deberemos rellenar en cualquier modelo, pero…justamente por eso los necesito

Lo segundo, es que como todos los modelos extienden de este, podre hacer comprobaciones acerca de la clase que son, y, en la version Java, incluso, podré esperarlos como parámetros…

La creación de la clase será necesariamente abstract, y conservara el nombre de la tabla a la que va a representar, que podremos cargar en el constructor,  y en su setter, y podremos consultar con su getter

El objeto sería este


<?php
namespace App\modelos;

use App\service\RutinasXml;

    abstract Class ModeloBase
    {
        private string $modelo;

        public function __construct(string $modelo){
            $this->setModelo($modelo);
        }

        /**
        * @return string
        */
        public function getModelo():string
        {
            return $this->modelo;
        }

        /**
        * @param mixed $modelo
        */
        public function setModelo(string $modelo):void
        {
            $this->modelo = $modelo;
        }

        public abstract function getId():int;
        public abstract function setId(int $id_valor):void;
        public static abstract function getNombreId():string;
        public static abstract function getNombreTabla():string;

        public function getXml(): string
        {
            $miXML=RutinasXml::arrayToXML($this->getArray(), $this->getModelo());
            return $miXML;
        }
    }

Si revisamos el codigo…

  • de la 10 a la 12, tenemos el constructor, en el que esperamos recibir el nombre del modelo, y nol lo guardamos
  • entre la 14 y la 28 tenemos el get y set del modelo…
  • en la 30, tenemos una función que cuando la implementemos, deberá retornar la PRIMARY_KEY del registro
  • en la 31, tenemos una función que cuando la implementemos, recibirá un valor y lo guardara en la PRIMARY_KEY del registro
  • en la 32 tenemos una función que cuando la implementemos, deberá retornar el nombre de la columna que tiene la PRIMARY_KEY
  • en la 33 devolverá el nombre de la tabla en la base de datos (normalmente sera igual al nombre del modelo (linea 8)
  • por ultimo, de la 35 a la 39, tenemos una rutina que es capaz de devolver este objeto como XML…por si lo necesitamos para algo

Ahora podemos ver como utilizamos nuestro ModeloBase, para implementar el modelo de una tabla, por ejemplo Cp_comunidades

Esta es la estructura

<?php
declare (strict_types = 1);
namespace App\modelos;

/*******************************************************************************
* Class Name: Cp_comunidades
* File Name: Cp_comunidades.php
* Generated: Friday, Nov 15, 2019 - 9:43:17 UTC
* - for Table: cp_comunidades
* - in Database: contabilidadautonomo
* Created by: table2class
********************************************************************************/

// Files required by class:
require_once ("ModeloBase.php");

// Begin Class "Cp_comunidades"
class Cp_comunidades extends ModeloBase{

// ************ Declaración de variables
   private $cpcoa_id;
   private $cpcoa_nombre;
   private $cpcoa_pais;

   const NOMBRE_TABLA_CP_COMUNIDADES = "cp_comunidades";
   const NOMBRE_PK_CP_COMUNIDADES = "cpcoa_id";

// Class Constructor
   public function __construct (int $cpcoa_id = null,string $cpcoa_nombre = null,int $cpcoa_pais = null) {
      parent::__construct ("Cp_comunidades");
      if (func_num_args () > 0) {
         $this->setCpcoa_id ($cpcoa_id);
         $this->setCpcoa_nombre ($cpcoa_nombre);
         $this->setCpcoa_pais ($cpcoa_pais);
      }
   }

// Class Destructor
   public function __destruct () {

   }

// GET Functions
   public function getid ():int {
      return (int) $this->cpcoa_id;
   }

   public function getCpcoa_id ():int {
      return (int) $this->cpcoa_id;
   }

   public function getCpcoa_nombre ():string {
      return (string) $this->cpcoa_nombre;
   }

   public function getCpcoa_pais ():int {
      return (int) $this->cpcoa_pais;
   }

// SET Functions
   public function setid (int $cpcoa_id):void {
      $this->cpcoa_id =$cpcoa_id;
   }

   public function setCpcoa_id (int $cpcoa_id):void {
      $this->cpcoa_id = $cpcoa_id;
   }

   public function setCpcoa_nombre (string $cpcoa_nombre):void {
      $this->cpcoa_nombre = $cpcoa_nombre;
   }

   public function setCpcoa_pais (int $cpcoa_pais):void {
      $this->cpcoa_pais = $cpcoa_pais;
   }

// Salida en array
   public function getInArray (): Array {
      $array =[
         "cpcoa_id"=> $this->cpcoa_id,
         "cpcoa_nombre"=> $this->cpcoa_nombre,
         "cpcoa_pais"=> $this->cpcoa_pais
      ];
      return $array;
   }

// Construye desde array
   public static function setFromArray (array $datos) : Cp_comunidades {
      $resp = new self ();
      $resp->setCpcoa_id ((int) $datos['cpcoa_id']);
      $resp->setCpcoa_nombre ($datos['cpcoa_nombre']);
      $resp->setCpcoa_pais ((int) $datos['cpcoa_pais']);
      return $resp;
   }

   public static function getNombreId ():string {
      return self::NOMBRE_PK_CP_COMUNIDADES;
   }

   public static function getNombreTabla ():string {
      return self::NOMBRE_TABLA_CP_COMUNIDADES;
   }

// para realizar desplegables

   public function getSelect (){
      return array (
         0 => "cpcoa_id",
         1 => "cpcoa_nombre"
      );
   }
}
// End Class "Cp_comunidades"

Revisemos el código

  • El constructor, acepta recibir todos los campos, pero tambien acepta dejarlo todo vacio. Observar que llama al constructor del padre, pasandole el nombre de clase, (no el de tabla) que lo identifica
  • en la 46 y en la 63 estan el set y el get de la Primary_key, que obliga ModeloBase
  • en la 79, dejo un metodo, que quizás sea interesante dejar forzado en el modelo, junto con el de la linea 89, ya que facilitan un set y un get desde y hacia un array
  • por ultimo, en la linea 108, hay una función que devuelve un array totalmente pensado para cuando tenemos que preparar selects…. aunque, quizas en una API no lo necesitemos, la herramienta que me genera el modelo, me lo prepara….

Como imagináis, este trabajo lo tendremos que realizar con todas las tabla, aunque, como pienso dejar todo el código en GitHub… cuando lo termine, ahora con que hagáis un par de tablas, para ir probando, ya vale.

En la siguiente entrega, nos preocuparemos de los DAO….

 

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.