typo3-simplify について
変更された TYPO3 v14 のコードを、動作を維持しながら簡潔にするためのコードレビュー用スキルです。TYPO3 API の再利用、コード品質、効率性を並行して確認し、修正と検証を進めます。
主な機能
- 013段階のコードレビュー
- 02TYPO3 v14 API と非推奨パターンの指針
- 03PHP、Fluid、TCA、サービスの確認
- 04効率性とクエリのレビュー
- 05動作を保つ修正と検証
活用シーン
- 01TYPO3 拡張の最近の変更をレビュー
- 02独自コードを TYPO3 コア API に置換
- 03v14 の非推奨パターンを特定
- 04非効率なデータベースアクセスを削減
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dirnbauer/ webconsulting-skills --skill typo3-simplifyインストール後、Claude Code で/typo3-simplifyを入力して読み込まれたか確認します。
詳細
TYPO3 コードの簡素化
Boris Cherny(Anthropic)の TYPO3 用に適応したコード簡素化エージェントです。 対象: TYPO3 v14.x のみ。
最近変更された TYPO3 コードを簡素化し、改善します。すべての機能を維持してください。巧妙さより明瞭さを、独自実装より TYPO3 API の使用を、非推奨の手法より v14 のパターンを優先してください。
プロセス
- 最近変更されたファイルを特定します(
git diff --name-only HEAD~1またはステージ済みの変更を使用) - 3 つのレビューを並行して実施します:再利用、品質、効率
- 指摘事項を集約し、重複を除き、影響度順に並べます
- 修正を適用し、動作に変更がないことを確認します
パス 1:TYPO3 API の再利用
TYPO3 がすでに提供している機能と重複する独自実装を探します。
独自コードをコア API に置き換える
| 独自のパターン | TYPO3 API による置き換え |
|---|---|
手動の DB クエリ($connection->executeQuery(...)) | 名前付きパラメーターを使う QueryBuilder |
$GLOBALS['TYPO3_REQUEST'] | ミドルウェア/コントローラー経由で ServerRequestInterface を注入 |
new FlashMessage(...) + 手動キュー | DI 経由の FlashMessageService |
| 手動での JSON レスポンス構築 | PSR-7 の JsonResponse |
GeneralUtility::makeInstance() | Services.yaml によるコンストラクターインジェクション |
$GLOBALS['TSFE']->id | $request->getAttribute('frontend.page.information')?->getId()(v14 での標準的な方法。routing のページ ID も使用できます) |
$GLOBALS['BE_USER'] | Context または BackendUserAuthentication を注入 |
ObjectManager::get() | コンストラクター DI |
| 手動でのファイルパス解決 | PathUtility、Environment::getPublicPath() |
| グローバル変数を使った独自のキャッシュ | キャッシュ設定を用い、DI 経由で CacheManager を使用 |
単一フィールドの取得に BackendUtility::getRecord() を使用 | 必要なカラムのみを選択する QueryBuilder |
| 手動でのページツリー走査 | RootlineUtility または PageRepository |
GeneralUtility::_GP() / _POST() / _GET() | $request->getQueryParams() / getParsedBody() |
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF'] への書き込み | PSR-14 イベントまたは ExtensionConfiguration |
| 手動でのリンク生成 | UriBuilder(バックエンド)または ContentObjectRenderer::typoLink() |
非推奨パターンの置き換え(v14)
| 非推奨 | v14 での置き換え |
|---|---|
ext_localconf.php のフック配列 | PSR-14 イベントに対する #[AsEventListener] |
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'] フック | PSR-14 イベント |
ext_tables.php によるモジュール登録 | Configuration/Backend/Modules.php |
XCLASS | PSR-14 イベントまたは DI によるデコレーション |
required、null に対する TCA eval | 専用の TCA キー:required、nullable |
trim に対する TCA eval | v14 でも引き続き有効です。専用の TCA 置き換えはありません。必要な場合は trim を eval に残してください |
renderType => 'inputDateTime' | 'type' => 'datetime' |
'type' => 'input', 'eval' => 'int' | 'type' => 'number' |
数値の配列キーを使う items | label/value キーを使う items |
過去に削除された機能(v14 より前のコードで見かける場合があります)
| 削除済み/レガシー | 時期 | 現代的な方法 |
|---|---|---|
switchableControllerActions | v10.3 で非推奨(#89463)、v12.0 で削除 | プラグイン登録を分ける |
Signal/Slot Dispatcher | v12 で削除 | PSR-14 イベント |
AbstractPlugin(pi_base) | v12.0 で @internal 化(#98281)、v12.4 で非推奨(#100639)、v13.0 で削除 | Extbase またはミドルウェア |
コード品質(非推奨ではない項目)
| トピック | 指針 |
|---|---|
$querySettings->setRespectStoragePage(false) | 有効な Extbase API です。明瞭さを保つため、リポジトリ内に分散させるのではなく、リポジトリファクトリーまたはコントローラーでクエリ設定を行うことを優先してください |
パス 2:コード品質
PHP クラス
- 1 ファイルにつき 1 クラスとし、PSR-4 オートローディングを使用する
- すべての PHP ファイルに
declare(strict_types=1)を指定する - 継承を想定していないクラスには
finalを指定する - イミュータブルなプロパティには
readonlyを指定する - DI 依存関係にはコンストラクター昇格を使用する
- すべてのメソッドに明示的な戻り値の型を指定する
- 未使用の
useインポートを残さない - エラーを抑制しない(
@) - 深いネストよりガード節を優先する(早期リターン)
- より具体的な型がある場合は、混合型を使用しない
-
array型宣言を、型付き配列または DTO に置き換える
// Before
class MyService
{
private ConnectionPool $connectionPool;
private Context $context;
public function __construct(ConnectionPool $connectionPool, Context $context)
{
$this->connectionPool = $connectionPool;
$this->context = $context;
}
public function getData($id)
{
// ...
}
}
// After
final class MyService
{
public function __construct(
private readonly ConnectionPool $connectionPool,
private readonly Context $context,
) {}
public function getData(int $id): array
{
// ...
}
}
Fluid テンプレート
- インライン PHP や複雑な ViewHelper のチェーンを使用しない
- ハードコードされた文字列ではなく、
<f:translate>を使用する - 手動の
<a href>ではなく、<f:link.page>/<f:link.typolink>を使用する - 手動の
<img>タグではなく、<f:image>を使用する - 繰り返し使用するマークアップには Partial を使用する(DRY)
- Section はレイアウトスロットに使用し、再利用には使用しない(Partial を使用する)
- 絶対に必要な場合を除き、
{variable -> f:format.raw()}を使用しない(XSS のリスク) - 変数には camelCase を使用する
- 空の
<f:section>ブロックを削除する - ネストされた
<f:if>は、より明確になる場合、<f:switch>または三項演算子に簡素化する
TCA
-
label/valueキーを使う v14 のitems形式を使用する - すでに制限されているフィールドから、冗長な
'exclude' => trueを削除する - 専用の型を使用する:
'type' => 'email'、'type' => 'datetime'、'type' => 'number'、'type' => 'link'、'type' => 'color'、'type' => 'json' -
'eval' => 'required'ではなく、'required' => trueを使用する -
'eval' => 'null'ではなく、'nullable' => trueを使用する -
eval=>trimは引き続きサポートされるため、別のレイヤーでトリミングを置き換えない限り削除しない - 文字列フィールドの
'default' => ''を削除する(すでにデフォルト値です) - パレット定義を統合する(フィールドが 1 つだけのパレットを削除する)
- TYPO3 v14 で
ctrlから自動作成される定型的なcolumns定義を削除する:hidden、starttime、endtime、fe_group、sys_language_uid、l10n_parent、l10n_diffsource - enablecolumns にはパレットを使用する:Core は
hiddenにパレットキーhiddenを、starttime、endtime、fe_groupにaccessを使用する(テーブルのtypesのshowitemでキーを確認する) -
ctrlで有効化されている場合、ext_tables.sqlから 標準の ctrl カラム(hidden、starttime、endtime、fe_group、sys_language_uid、l10n_parent、l10n_source、sorting、deleted、crdate、tstamp)を削除する — そのテーブルで自動管理されている場合に限る - types から未使用の
showitemフィールドを削除する
Services.yaml
- オートワイヤリングを使用する(型宣言で解決できる場合は、明示的な引数定義を削除する)
-
_defaults: autowire: true, autoconfigure: true, public: falseを使用する - オートワイヤリングで処理されるクラスの手動サービス定義を削除する
- オートワイヤリングでコンストラクションを処理できる場合は
factory:ブロックを削除する。オートワイヤリングでは解決できない複雑なコンストラクションにはfactory:を残す。#[Autoconfigure]はサービスにタグを付けたり設定したりするものであり、コンストラクションのfactory:を置き換えるものではありません -
GeneralUtility::makeInstance()に必要な場合を除き、public: trueを削除する
ext_localconf.php / ext_tables.php
- コードを最小限にする — 可能な場合は
Configuration/ファイルに移動する - プラグイン登録のみとし、ビジネスロジックは含めない
- フロントエンドプラグイン:
ext_localconf.phpのExtensionUtility::configurePlugin()とConfiguration/TCA/Overrides/tt_content.phpのExtensionUtility::registerPlugin()(または TCAitems)を使用する — 完全な登録には両方が必要 -
addPageTSConfigを使用しない —Configuration/page.tsconfigを使用する -
addUserTSConfigを使用しない —Configuration/user.tsconfigを使用する -
addTypoScriptを使用しない —Configuration/TypoScript/setup.typoscriptを使用する
パス 3:効率性
- QueryBuilder:
*ではなく、必要なカラムのみを選択する - QueryBuilder:単一の行を想定する場合は
setMaxResults()を追加する - 行数を数えるためにすべての行を取得するのではなく、
count()クエリを使用する - TYPO3 Caching Framework でコストの高い処理をキャッシュする
- Extbase リポジトリで N+1 クエリを避ける(
JOINまたは一括読み込みを使用する) - リクエストごとに再処理するのではなく、
TYPO3\CMS\Core\Resource\ProcessedFileRepositoryを使用する - ページネーションのない
findAll()呼び出しを削除する -
#[\TYPO3\CMS\Extbase\Attribute\ORM\Lazy]でファイル参照を遅延読み込みする(旧式の@Lazyアノテーションを置き換える) -
foreachと手動のin_array()によるフィルタリングを、QueryBuilder のWHERE INに置き換える - CLI コマンド内の冗長な
cache:flush呼び出しを削除する
出力形式
分析後、ファイルごとに所見をまとめて報告してください。
## Classes/Controller/MyController.php
:42 — replace GeneralUtility::makeInstance(MyService::class) → constructor injection
:18 — add return type `: ResponseInterface`
:55 — deprecated: $GLOBALS['TSFE']->id → $request routing attribute
:67 — guard clause: invert condition, return early, reduce nesting
## Resources/Private/Templates/List.html
:12 — hardcoded string "No items found" → f:translate
:34 — manual <a href> → f:link.page
## Configuration/TCA/Overrides/tt_content.php
:8 — legacy items format `['Label', 'value']` → `['label' => 'Label', 'value' => 'value']`
Applied 7 fixes. No behavior changes. Run tests to verify.
バージョンフォールバック
同じコードベースを TYPO3 v13 と v14 で実行する必要がある場合(デュアルバージョン拡張機能)、移行期間中は一時的に次のパターンを維持できます。
Configuration/RequestMiddlewares.phpで PSR-15 ミドルウェアを登録する(Core がサポートするパターン)#[AsEventListener]と併せてServices.yamlのイベントリスナー設定を維持するlabel/value形式と併せて、数値形式の TCAitems配列を維持する- アドホックな
factory:ブロックよりも、Services.yamlの_defaults(autowire/autoconfigure)と Core の登録属性(#[AsCommand]、#[AsEventListener]、…)を優先する
v14 のみの簡素化対象
以下の簡素化の機会は v14 固有 です。
v14 の簡素化パターン [v14 のみ]
| パターン | 簡素化 |
|---|---|
$GLOBALS['TSFE'] へのアクセス | v14 では致命的エラー(Breaking #107831)— $request->getAttribute('frontend.page.information') に置き換える |
Extbase アノテーション(@validate) | #[\TYPO3\CMS\Extbase\Attribute\Validate] に置き換える |
MailMessage->send() | TYPO3\CMS\Core\Mail\MailerInterface を注入し、$this->mailer->send($email) を呼び出す |
FlexFormService の使用 | FlexFormTools を優先する。FlexFormService は v14 でも BC エイリアスとして残りますが、新しいコードでは使用しないでください |
| Bootstrap Modal JS | フロントエンド: 適切な場合はネイティブの <dialog> を使用する。バックエンド: @typo3/backend/modal を使用する — v14 ではネイティブの <dialog> をラップしています(Breaking #107443)。生の Bootstrap modal JS は使用しないでください |
TCA ctrl.searchFields(v14 で削除) | TYPO3 v14 はバックエンドの検索フィールドを自動的に導出します。サポートされている場合は、カラムごとに 'searchable' => true/false で対象を調整してください(サポートされるフィールドタイプ:input、text、email、link、slug、color、datetime(カスタム dbType なし)、flex、json、uuid) |
| カスタムローカライゼーションパーサー | Symfony Translation Component の統合により置き換えられています(Feature #107436)。v14 では BC が維持されていますが、新しいコードでは新しい Symfony Translation API を優先してください |
GeneralUtility::createVersionNumberedFilename() | SystemResourceFactory/SystemResourcePublisherInterface に置き換える(System Resource API、Feature #107537) |
クレジットと帰属表示
このスキルは、 Anthropic による優れた取り組みをもとにしています。
元のリポジトリ:https://github.com/anthropics/claude-plugins-official/tree/main/plugins/code-simplifier
このスキルコレクションの形成に役立った、惜しみないオープンソースへの貢献に対し、Anthropic に心より感謝します。 このスキルコレクション向けに webconsulting.at が調整しました
コメント
Markdown 対応