Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

generate-fixtures output is unreadable as a maintained fixture

Cerrado
#452 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Ya se ha fusionado un pull request relacionado.

  • #453 de @silverbackdan — fusionado

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Refactorización
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
php
Área
tooling

Línea de trabajo

Start in GenerateFixturesCommand, reading emitComponent(), emitGroup(), exportValue(), build() and the $deferredReferences / afterRoutes() handling. Generate a fixture from a small site and compare it with the output. Done when the generated class has readable variable names, inline references, nowdoc HTML, opt-in timestamps and per-page methods, and still reloads to the same rows.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

enhancement

silverback:api-components:generate-fixtures (2.0.0-alpha.18) reproduces a site faithfully. A snapshot of a production site with 18 pages, 66 groups, 119 components and 13 images reloads with every content row matching. But the class it writes can't be maintained as a fixture: a developer opening it found it unreadable. The causes are all in GenerateFixturesCommand:

  1. Positional variables. Every component is $c[n] and every group $g[n], numbered in walk order (emitComponent(), emitGroup()). $c[35]->html = ... says nothing about what it is.
  2. References are written far from their component. Every non-component association (e.g. a navigation link's route) is deferred to an afterRoutes() block at the end of the file ($deferredReferences). A link is created on line 35 and given its route 600 lines later as $c[3]->route = $cwa->getRoute('/about/team').
  3. HTML on one line. exportValue() uses var_export(), so rich HTML becomes a single quoted string. The longest line in the snapshot is 12,963 characters.
  4. Timestamps on everything. Every publishable component gets setPublishedAt(new \DateTime('2026-10-02T14:48:09.000000+00:00')): 81 of them in a 649-line file.
  5. No structure. build() is a single flat method, with no marker where each page starts, and the layout's groups are written before any page.
  6. Lists written with index keys. uiClassNames and other plain lists come out as [0 => '...'].
Requested
  1. Readable variable names. Derive them from the short class name plus an identifying value (label, title, reference or the owning page's reference), e.g. $aboutTeamLink or $homeHeroGroup, with a numeric suffix only to resolve clashes. Don't create a variable at all for components nothing refers to later.
  2. Set references inline. afterRoutes() exists only because the target route isn't built yet. A lazy builder reference resolved on flush (e.g. $cwa->routeRef('about-team')) would let the generator write $link->route = $cwa->routeRef('about-team') next to the link. Keep afterRoutes() for draft components only.
  3. Readable HTML. Emit long HTML as a nowdoc with a line break after each block-level closing tag. Alternatively, add an option to write each one to assets/html/<name>.html and load it with file_get_contents(__DIR__ . '/assets/html/<name>.html').
  4. Timestamps opt-in. By default, emit a single "published" call per component (e.g. $cwa->publish($x), published at load time) instead of the exact publishedAt. Add --keep-timestamps for exact copies.
  5. Structure. At minimum, write a comment header for each layout and page, e.g. // Page: About - Team (/about/team). Better: one private method per layout and top-level page, called from build(), keeping nested children inside their parent's method.
  6. Plain lists. Use array_is_list() in exportValue() so lists are written as ['a', 'b'].

The expected result: running generate-fixtures against a live site gives a class a developer can read, edit and review in a diff as easily as a hand-written AbstractCwaScaffold, while still reloading to the same rows.

Lenguaje dominante
PHP
Estrellas
32
Forks
8
Merge medio
1 h 1 min
PR fusionados (30 d)
159

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de components-web-app/api-components-bundle

Todos los issues de components-web-app/api-components-bundle

Issues similares

Más issues de PHP

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.