在Rector规则的refactor函数中,如何将Node节点打印为PHP代码?
在Rector规则的refactor函数中打印Node节点为PHP代码的方法
要在Rector规则的refactor函数中将当前Node节点输出为PHP代码,核心是利用Rector内置的PrinterInterface组件,步骤如下:
1. 注入PrinterInterface依赖
在自定义规则类的构造函数中注入PrinterInterface,这是Rector依赖注入机制的标准用法:
use PhpParser\Node; use Rector\Core\Contract\Rector\RectorInterface; use Rector\Core\Printer\PrinterInterface; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; final class YourCustomRector implements RectorInterface { public function __construct( private readonly PrinterInterface $printer ) { } // 实现规则描述方法 public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('自定义规则的功能描述', []); } // 指定当前规则要处理的Node类型 public function getNodeTypes(): array { return [Node\Expr\Assign::class]; // 示例:处理赋值表达式节点 } }
2. 在refactor方法中打印Node节点
拿到当前处理的Node后,调用PrinterInterface的print()方法即可将Node转换为对应的PHP代码字符串,随后直接输出即可:
public function refactor(Node $node): ?Node { // 将Node节点转换为PHP代码字符串 $nodePhpCode = $this->printer->print($node); // 打印输出,可根据环境选择合适的方式 var_dump($nodePhpCode); // 若项目安装了Symfony VarDumper,可使用更美观的格式化输出 // dump($nodePhpCode); // 你的重构逻辑代码... return $node; }
额外说明
- 如果需要打印包含该Node的整个PHP文件代码,可通过Node的文件信息获取路径后,使用
printFile()方法:$filePath = $node->getStartFileInfo()->getPath(); $fullFileCode = $this->printer->printFile($filePath); - 若你的规则继承自
AbstractRector,则无需手动注入PrinterInterface,直接使用$this->printer即可调用相关方法。
内容的提问来源于stack exchange,提问作者realtebo
相关产品推荐
相关产品推荐

