Vendimia 0.9999999999999

5 años después de agrupar mis librerías de desarrollo web, y publicarlas con el nombre de Vendimia, decidí volver a hacer todo desde cero.

Muchas razones. La segunda más importante es la llegada de PHP 8. De entre tantas cosas buenas que trajo esta versión, la que más influyó fue los atributos, que corrige varios hacks que tuve que hacer para la definición de los campos en el ORM usando DocBlock.

E.g. Esta es la definición de una entidad del ORM, usando el Vendimia «legacy»:

Use Vendimia\Orm\Field;
Use Vendimia\Orm\Entity;

class Venta extends Entity
{
/**
* @V:Field\DateTime
*/
private $fecha;

/**
* @V:Field\Char 60
*/
private $cliente;

/**
* @V:Field\OneToMany Item
*/
private $items;

/**
* @V:Field\Boolean default:false
*/
private $anulada;
}

Obtener el FQCN de una clase desde un string, como Field\DateTime, implica analizar el fichero PHP donde está definida la clase, buscar los keywords use, y procesar su valor… Los parámetros a cada objeto eran pasadas como un array al __construct de la clase, previamente procesados como un ‘loose’ JSON.

Ahora, en el nuevo Vendimia:

use Vendimia\Database\Entity;
use Vendimia\Database\Field;

class Venta extends Entity
{
#[Field\DateTime]
public $fecha;

#[Field\Char(60)]
public $cliente;

#[Field\OneToMany(Item::class)]
public $items;

#[Field\Boolean(default: false)]
public $anulada;
}

Lindo. Las clases son resueltas por el mismo PHP, los argumentos son pasados al constructor usando parámetros con nombre.

Antes de usar el DocBlock, usaba un array simple para la definición de la metadata de un campo. Esa forma aún persistía en la definición de formularios. Ahora todas las definiciones usan atributos.

Aún así, estoy apuntando usar PHP 8.1, por que quiero usar los Enums entre otros detallitos.

Otra razón para rehacer todo, fue las nuevas ideas que he adquirido con el paso del tiempo. Ahora Vendimia ya no será un proyecto monolítico, estará formado por varios módulos independientes y reusables, y se instalarán vía Composer.

¿Vendimia 2?

Si, y no. Ya que no tuvo visibilidad, desapareceré la versión anterior. Como si nunca existió.

Aun no hay documentación. Cuando escriba aunque sea un README.md en cada módulo, iré publicando los enlaces en la página de vendimia, y en su cuenta de Twitter. Mientras tanto, esta es una lista de las cosas que he estado subiendo:

Object Manager: Inyector de dependencias y almacén de objetos.

Routing: Manejo de rutas para acceder a controladores y otros Callables.

Database: ORM con migraciones.

Form: Generación de formularios HTML, y validación de datos.

MadSS: Preprocessador de CSS a la SASS.

Collection: Arrays-como-objetos.

Session: Manejo de sesiones.

DateTime: Manejo de fechas, horas e intervalos. Espero que pronto acepten el RFC para sobrecarga de operadores.

…y la primera razón es…

Penny: Solo una pregunta… ¿Por qué?
Todos: Porque podemos.
The Cooper-Hofstadter Polarization