{"id":812,"date":"2021-06-20T04:12:43","date_gmt":"2021-06-20T09:12:43","guid":{"rendered":"https:\/\/drmad.org\/blog\/?p=812"},"modified":"2021-09-21T01:16:20","modified_gmt":"2021-09-21T06:16:20","slug":"vendimia-0-9999999999999","status":"publish","type":"post","link":"https:\/\/drmad.org\/blog\/vendimia-0-9999999999999.html","title":{"rendered":"Vendimia 0.9999999999999"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/drmad.org\/blog\/m3-framework.html\">5 a\u00f1os despu\u00e9s<\/a> de agrupar mis librer\u00edas de desarrollo web, y publicarlas con el nombre de <a href=\"https:\/\/vendimia.in\/\">Vendimia<\/a>, decid\u00ed volver a hacer todo desde cero. \ud83e\udd2a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Muchas razones. La segunda m\u00e1s importante es la llegada de <a href=\"https:\/\/drmad.org\/blog\/php8-on-fire-%f0%9f%94%a5.html\">PHP 8<\/a>. De entre tantas cosas buenas que trajo esta versi\u00f3n, la que m\u00e1s influy\u00f3 fue los <a href=\"https:\/\/www.php.net\/manual\/es\/language.attributes.overview.php\">atributos<\/a>, que corrige <a rel=\"noreferrer noopener\" href=\"https:\/\/stackoverflow.com\/questions\/43351573\/build-fqcn-from-a-string\" target=\"_blank\">varios hacks<\/a> que tuve que hacer para la definici\u00f3n de los campos en el ORM usando DocBlock. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E.g. Esta es la definici\u00f3n de una entidad del ORM, usando el Vendimia \u00ablegacy\u00bb:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Use Vendimia\\Orm\\Field;\nUse Vendimia\\Orm\\Entity;\n\nclass Venta extends Entity\n{\n    \/**\n     * @V:Field\\DateTime\n     *\/\n    private $fecha;\n    \n    \/**\n     * @V:Field\\Char 60\n     *\/\n    private $cliente;\n\n    \/**\n     * @V:Field\\OneToMany Item\n     *\/\n    private $items;\n    \n    \/**\n     * @V:Field\\Boolean default:false\n     *\/\n    private $anulada;\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Obtener el FQCN de una clase desde un string, como <code>Field\\DateTime<\/code>, implica analizar el fichero PHP donde est\u00e1 definida la clase, buscar los keywords <code>use<\/code>, y procesar su valor&#8230; Los par\u00e1metros a cada objeto eran pasadas como un array al <code>__construct<\/code> de la clase, previamente procesados como un &#8216;loose&#8217; JSON.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora, en el nuevo Vendimia:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">use Vendimia\\Database\\Entity;\nuse Vendimia\\Database\\Field;\n\nclass Venta extends Entity\n{\n    #[Field\\DateTime]\n    public $fecha;\n    \n    #[Field\\Char(60)]\n    public $cliente;\n\n    #[Field\\OneToMany(Item::class)]\n    public $items;\n    \n    #[Field\\Boolean(default: false)]\n    public $anulada;\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Lindo. Las clases son resueltas por el mismo PHP, los argumentos son pasados al constructor usando <a href=\"https:\/\/www.php.net\/manual\/es\/functions.arguments.php#functions.named-arguments\">par\u00e1metros con nombre<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de usar el DocBlock, usaba un array simple para la definici\u00f3n de la metadata de un campo. Esa forma a\u00fan persist\u00eda en la definici\u00f3n de formularios. Ahora todas las definiciones usan atributos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A\u00fan as\u00ed, estoy apuntando usar PHP 8.1, por que quiero usar los <a href=\"https:\/\/wiki.php.net\/rfc\/enumerations\">Enums<\/a> entre otros detallitos. \ud83d\ude0b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Otra raz\u00f3n para rehacer todo, fue las nuevas ideas que he adquirido con el paso del tiempo. Ahora Vendimia ya no ser\u00e1 un proyecto monol\u00edtico, estar\u00e1 formado por varios m\u00f3dulos independientes y reusables, y se instalar\u00e1n v\u00eda <a rel=\"noreferrer noopener\" href=\"https:\/\/getcomposer.org\/\" target=\"_blank\">Composer<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfVendimia 2?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si, y no. Ya que no tuvo visibilidad, desaparecer\u00e9 la versi\u00f3n anterior. Como si nunca existi\u00f3. \ud83d\ude2c<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aun no hay documentaci\u00f3n. Cuando escriba aunque sea un <code>README.md<\/code> en cada m\u00f3dulo, ir\u00e9 publicando los enlaces <a href=\"https:\/\/vendimia.in\" data-type=\"URL\" data-id=\"https:\/\/vendimia.in\">en la p\u00e1gina de vendimia<\/a>, y en su <a href=\"https:\/\/twitter.com\/vendimia_php\">cuenta de Twitter<\/a>. Mientras tanto, esta es una lista de las cosas que he estado subiendo:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/github.com\/vendimia\/object-manager\">Object Manager<\/a>: Inyector de dependencias y almac\u00e9n de objetos.<\/li><li><a href=\"https:\/\/github.com\/vendimia\/routing\">Routing<\/a>: Manejo de rutas para acceder a controladores y otros Callables.<\/li><li><a href=\"https:\/\/github.com\/vendimia\/database\">Database<\/a>: ORM con migraciones.<\/li><li><a href=\"https:\/\/github.com\/vendimia\/form\">Form<\/a>: Generaci\u00f3n de formularios HTML, y validaci\u00f3n de datos.<\/li><li><a href=\"https:\/\/github.com\/vendimia\/madss\">MadSS<\/a>: Preprocessador de CSS <em>a la<\/em> <a href=\"https:\/\/sass-lang.com\/\">SASS<\/a>.<\/li><li><a href=\"https:\/\/github.com\/vendimia\/collection\">Collection<\/a>: Arrays-como-objetos.<\/li><li><a href=\"https:\/\/github.com\/vendimia\/session\">Session<\/a>: Manejo de sesiones.<\/li><li><a href=\"https:\/\/github.com\/vendimia\/datetime\">DateTime<\/a>: Manejo de fechas, horas e intervalos. Espero que pronto acepten el <a href=\"https:\/\/wiki.php.net\/rfc\/user_defined_operator_overloads\">RFC para sobrecarga de operadores<\/a>. \ud83d\ude01<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">&#8230;y la primera raz\u00f3n es&#8230;<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><a href=\"https:\/\/es.wikipedia.org\/wiki\/Penny_(The_Big_Bang_Theory)\">Penny<\/a>: Solo una pregunta\u2026 <a href=\"https:\/\/www.youtube.com\/watch?v=E6RqefGk0wA#t=2m\">\u00bfPor qu\u00e9?<\/a><br><a href=\"https:\/\/es.wikipedia.org\/wiki\/The_Big_Bang_Theory\">Todos<\/a>: Porque podemos.<\/p><cite>The Cooper-Hofstadter Polarization<\/cite><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vendimia \u00ab2\u00bb &#8211; programado desde cero. Because we can \ud83d\ude2c<\/p>\n","protected":false},"author":1,"featured_media":814,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[14,34],"tags":[],"class_list":["post-812","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php","category-php8"],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/drmad.org\/blog\/wp-content\/uploads\/2021\/06\/because-we-can.jpg?fit=1920%2C540&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6p3z1-d6","jetpack-related-posts":[],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/comments?post=812"}],"version-history":[{"count":21,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/812\/revisions"}],"predecessor-version":[{"id":883,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/posts\/812\/revisions\/883"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/media\/814"}],"wp:attachment":[{"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/media?parent=812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/categories?post=812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/drmad.org\/blog\/wp-json\/wp\/v2\/tags?post=812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}