Pestle – Generador de código para Magento 2

Últimamente le estoy dando mucha caña a automatizar cosas en Magento… y llevo un tiempo usando Pestle de Alan Storm. He visto posts de gente que utiliza templates en PHPStorm, y cosas similares pero esta forma es la mejor que he visto yo al menos.

¿Qué es Pestle?

Pues básicamente es un framework PHP que usarás por consola para automatizar tareas. En este caso, trae de serie muchas (pero muchas) automatizaciones para generar código de Magento 2 que es lo me interesa, como generar lo siguiente:

  • estructura básica de un módulo entero
  • controlador y su enrutador
  • vistas
  • observers

Podemos ver una excelente documentación en https://pestle.readthedocs.io/en/latest/

Ejemplos de generar módulo completo

pestle.phar magento2:generate:full-module

Nos preguntará interactivamente en la consola por el package name, module name, model name. No le hace falta más para obrar su magia.

Este comando, realmente lo que hace es tirarnos por consola lo que debemos copiar y pegar para ejecutar de nuevo como comando, ya que realmente cada uno de estos «subcomandos» podemos ejecutarlos independientemente pero aquí ya los hace todos juntos (genial, cuanto menos escribamos, menos nos equivocamos) para generar un «full-module». Cogido de la documentación sería esto lo que nos tira, que hacemos un copy/paste+intro:

pestle.phar magento2:generate:module Pulsestorm Pestle 0.0.1
pestle.phar magento2:generate:crud-model Pulsestorm_Pestle Thing
pestle.phar magento2:generate:acl Pulsestorm_Pestle Pulsestorm_Pestle::things
pestle.phar magento2:generate:menu Pulsestorm_Pestle "" Pulsestorm_Pestle::things Pulsestorm_Pestle::things "Pestle things" pulsestorm_pestle_things/index/index 10
pestle.phar magento2:generate:menu Pulsestorm_Pestle Pulsestorm_Pestle::things Pulsestorm_Pestle::things_list Pulsestorm_Pestle::things "Thing Objects" pulsestorm_pestle_things/index/index 10
pestle.phar magento2:generate:route Pulsestorm_Pestle adminhtml pulsestorm_pestle_things Index Index
pestle.phar magento2:generate:view Pulsestorm_Pestle adminhtml pulsestorm_pestle_things_index_index Main content.phtml 1column
pestle.phar magento2:generate:ui:grid Pulsestorm_Pestle pulsestorm_pestle_things 'Pulsestorm\Pestle\Model\ResourceModel\Thing\Collection' thing_id
pestle.phar magento2:generate:ui:add-column-text app/code/Pulsestorm/Pestle/view/adminhtml/ui_component/pulsestorm_pestle_things.xml title "Title"
pestle.phar magento2:generate:ui:form Pulsestorm_Pestle 'Pulsestorm\Pestle\Model\Thing' Pulsestorm_Pestle::things
pestle.phar magento2:generate:ui:add_to_layout app/code/Pulsestorm/Pestle/view/adminhtml/layout/pulsestorm_pestle_things_index_index.xml content pulsestorm_pestle_things
pestle.phar magento2:generate:acl:change_title app/code/Pulsestorm/Pestle/etc/acl.xml Pulsestorm_Pestle::things "Manage things"
pestle.phar magento2:generate:controller_edit_acl app/code/Pulsestorm/Pestle/Controller/Adminhtml/Index/Index.php Pulsestorm_Pestle::things
pestle.phar magento2:generate:remove-named-node app/code/Pulsestorm/Pestle/view/adminhtml/layout/pulsestorm_pestle_things_index_index.xml block pulsestorm_pestle_block_main

Vemos que con un simple comando que nos hace 3 preguntas, generamos todo esto (ahorras muchísimo tiempo):

  • Model: lectura/escritura de datos
  • Setup Resource Install: generar tabla en base de datos
  • Backend ACL and Menu configuration: elemento del menú en el admin
  • Routing configuration and controller: para páginas de index, edit y save
  • UI component configuration: necesario para renderizar los datos

Con esto tenemos una ENORME base sobre la cual construir nuestro módulo y aplicarle la funcionalidad, ya que poco funcionamiento tiene ahora mismo. Pero el esqueleto que nos ofrece es brutal, la de veces que me he tirado horas literalmente intentando saber el motivo de que no funcione cuando me faltaba crear un xml, o no había puesto el nombre correcto en un archivo de configuración…

Podemos ir generando poco a poco el módulo con los distintos «subcomandos». Pero veo más práctico aprenderme 1 comando y tardar 3 minutos en eliminar lo que no voy a usar de todo lo que me ha generado que meter 6 comandos (tener que acordarme de ellos).

De esta forma ejecutamos 1 comando y prácticamente podemos preocuparnos ya de la feature en la que estamos en vez de estar copiando código para se ejecute el módulo.

🤤 im-pre-sio-nan-te 🤤

Otros comandos útiles

Los encontraremos en la documentación, pero no está de más citarlos aquí brevemente:

Principales

# genera lo indispensable para que m2 reconozca modulo: module.xml y registration.php
pestle.phar magento2:generate:module

# genera phtml para el block class
# genera el block class
# genera/edita layout handle, auto genera codigo para añadir el block class al container block
pestle.phar magento2:generate:view

# genera model, resource model, collection (active record crud)
# genera install schema (create table)
# genera item repository, item repository interface, api interface
pestle.phar magento2:generate:crud-model

# genera acl.xml
pestle.phar magento2:generate:acl

# genera menu en el admin (top level o sub item level)
pestle.phar magento2:generate:menu

# mete nodo <uiComponent/> en un layout xml especificado
pestle.phar magento2:generate:ui:add-to-layout
# genera UI Component XML para un grid component (estandar CRUD de magento)
pestle.phar magento2:generate:ui:grid
# mete un nuevo nodo de columna en fichero UI Component XML
pestle.phar magento2:generate:ui:add-column-text
# genera ficheros XML de configuración y controllers para ejecutar CRUD de edición desde el admin
pestle.phar magento2:generate:ui:form

Secundarios

# genera indispensable para comando symphony: clase php y di.xml
pestle.phar magento2:generate:command

# genera controller y routes.xml
pestle.phar magento2:generate:route

# genera lo basico para un theme (child o no)
pestle.phar magento2:generate:theme

# genera archivos upgrade schema y data
# mete nueva version en module.xml
pestle.phar magento2:generate:schema-upgrade

# mete un nuevo field en un UI Component form ya existente
pestle.phar magento2:generate:ui:add-form-field
# mete un nuevo nodo fieldset aen un UI Component form ya existente
pestle.phar magento2:generate:ui:add-form-fieldset

Y quedan más, relacionados con DI, composer, observers…