Skip to content

[4.3-symfony7] AttributeArgumentsOrderRector で非推奨クラスのパラメータ名が使われる問題 #6540

Description

@nanasess

概要

AttributeArgumentsOrderRector で、Rectorの実行順序によって非推奨クラス(SensioFrameworkExtraBundle)のコンストラクタパラメータ名が使われてしまう問題があります。

問題の詳細

発生する現象

@Template("@admin/Content/cache.twig") アノテーションが以下のように変換されます:

期待する結果:

#[Template(template: '@admin/Content/cache.twig')]

実際の結果:

#[Template(data: '@admin/Content/cache.twig')]

原因

  1. Rectorの AnnotationToAttributeRector がアノテーションをアトリビュートに変換
  2. この時点ではまだ Sensio\Bundle\FrameworkExtraBundle\Configuration\Template がuse文で参照されている
  3. AttributeArgumentsOrderRector がリフレクションで Sensio\...\Template のコンストラクタを調べる
  4. Sensioの Template クラスの第一パラメータは $data なので、data: という名前付き引数になる
  5. その後、RenameClassRector でuse文が Symfony\Bridge\Twig\Attribute\Template にリネームされる
  6. しかし、パラメータ名 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)

Metadata

Metadata

Labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions