mcpField
T
typo3-simplify

typo3-simplify

github.com/dirnbauer開発3354 回インストール13 週間前に更新
リポジトリ

typo3-simplify について

変更された TYPO3 v14 のコードを、動作を維持しながら簡潔にするためのコードレビュー用スキルです。TYPO3 API の再利用、コード品質、効率性を並行して確認し、修正と検証を進めます。

主な機能

  1. 013段階のコードレビュー
  2. 02TYPO3 v14 API と非推奨パターンの指針
  3. 03PHP、Fluid、TCA、サービスの確認
  4. 04効率性とクエリのレビュー
  5. 05動作を保つ修正と検証

活用シーン

  1. 01TYPO3 拡張の最近の変更をレビュー
  2. 02独自コードを TYPO3 コア API に置換
  3. 03v14 の非推奨パターンを特定
  4. 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 のパターンを優先してください。

プロセス

  1. 最近変更されたファイルを特定します(git diff --name-only HEAD~1 またはステージ済みの変更を使用)
  2. 3 つのレビューを並行して実施します:再利用、品質、効率
  3. 指摘事項を集約し、重複を除き、影響度順に並べます
  4. 修正を適用し、動作に変更がないことを確認します

パス 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
XCLASSPSR-14 イベントまたは DI によるデコレーション
required、null に対する TCA eval専用の TCA キー:required、nullable
trim に対する TCA evalv14 でも引き続き有効です。専用の TCA 置き換えはありません。必要な場合は trim を eval に残してください
renderType => 'inputDateTime''type' => 'datetime'
'type' => 'input', 'eval' => 'int''type' => 'number'
数値の配列キーを使う itemslabel/value キーを使う items
過去に削除された機能(v14 より前のコードで見かける場合があります)
削除済み/レガシー時期現代的な方法
switchableControllerActionsv10.3 で非推奨(#89463)、v12.0 で削除プラグイン登録を分ける
Signal/Slot Dispatcherv12 で削除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()(または TCA items)を使用する — 完全な登録には両方が必要
  • 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 形式と併せて、数値形式の TCA items 配列を維持する
  • アドホックな 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 が調整しました

コメント