Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

generate-fixtures output is unreadable as a maintained fixture

クローズ
#452 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

関連するプルリクエストがすでにマージされています。

  • #453 @silverbackdan による — マージ済み

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
35/100
issue の種類
リファクタリング
明瞭さ
おおむね明確
活発さ
活発
技術スタック
php
領域
tooling

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

説明

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.

主要言語
PHP
スター
32
フォーク
8
平均マージ
1時間 1分
マージ済み PR(30日)
159

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

components-web-app/api-components-bundle のほかの issue

components-web-app/api-components-bundle の issue をすべて見る

似ている issue

PHP の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。