概要
AttributeArgumentsOrderRector で、Rectorの実行順序によって非推奨クラス(SensioFrameworkExtraBundle)のコンストラクタパラメータ名が使われてしまう問題があります。
問題の詳細
発生する現象
@Template("@admin/Content/cache.twig") アノテーションが以下のように変換されます:
期待する結果:
#[Template(template: '@admin/Content/cache.twig')]
実際の結果:
#[Template(data: '@admin/Content/cache.twig')]
原因
- Rectorの
AnnotationToAttributeRector がアノテーションをアトリビュートに変換
- この時点ではまだ
Sensio\Bundle\FrameworkExtraBundle\Configuration\Template がuse文で参照されている
AttributeArgumentsOrderRector がリフレクションで Sensio\...\Template のコンストラクタを調べる
- Sensioの Template クラスの第一パラメータは
$data なので、data: という名前付き引数になる
- その後、
RenameClassRector でuse文が Symfony\Bridge\Twig\Attribute\Template にリネームされる
- しかし、パラメータ名
data: はそのまま残ってしまう
参考: 各クラスのコンストラクタ
Sensio\Bundle\FrameworkExtraBundle\Configuration\Template:
public function __construct(
$data = [], // ← 第一パラメータは $data
array $vars = [],
...
)
Symfony\Bridge\Twig\Attribute\Template:
public function __construct(
public string $template, // ← 第一パラメータは $template
public ?array $vars = null,
...
)
解決策
AttributeArgumentsOrderRector に非推奨クラスから新しいクラスへのマッピングを追加し、リフレクションを行う前にクラス名を変換する。
private const DEPRECATED_CLASS_MAPPING = [
'Sensio\Bundle\FrameworkExtraBundle\Configuration\Template' => 'Symfony\Bridge\Twig\Attribute\Template',
'Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache' => 'Symfony\Component\HttpKernel\Attribute\Cache',
'Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted' => 'Symfony\Component\Security\Http\Attribute\IsGranted',
'Sensio\Bundle\FrameworkExtraBundle\Configuration\Security' => 'Symfony\Component\Security\Http\Attribute\IsGranted',
];
環境
- PHP 8.3
- Symfony 7.4
- Rector (rector/rector-symfony)
概要
AttributeArgumentsOrderRectorで、Rectorの実行順序によって非推奨クラス(SensioFrameworkExtraBundle)のコンストラクタパラメータ名が使われてしまう問題があります。問題の詳細
発生する現象
@Template("@admin/Content/cache.twig")アノテーションが以下のように変換されます:期待する結果:
#[Template(template: '@admin/Content/cache.twig')]実際の結果:
#[Template(data: '@admin/Content/cache.twig')]原因
AnnotationToAttributeRectorがアノテーションをアトリビュートに変換Sensio\Bundle\FrameworkExtraBundle\Configuration\Templateがuse文で参照されているAttributeArgumentsOrderRectorがリフレクションでSensio\...\Templateのコンストラクタを調べる$dataなので、data:という名前付き引数になるRenameClassRectorでuse文がSymfony\Bridge\Twig\Attribute\Templateにリネームされるdata:はそのまま残ってしまう参考: 各クラスのコンストラクタ
Sensio\Bundle\FrameworkExtraBundle\Configuration\Template:
Symfony\Bridge\Twig\Attribute\Template:
解決策
AttributeArgumentsOrderRectorに非推奨クラスから新しいクラスへのマッピングを追加し、リフレクションを行う前にクラス名を変換する。環境