3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RectorでLaravelアプリケーションの自動リファクタリングを行う

Last updated at Posted at 2023-08-20

概要

下記記事を読んでRector素敵!かっこいい!ってなったので実際に使ってみました!

導入

前提環境

Composer version 2.5.1
Laravel Framework 9.48.0

公式のDocs通りコマンド実行する。

composer require rector/rector --dev

rector.phpを生成

vendor/bin/rector

rector.phpにディレクトリパスとルールを指定する

rector.php
<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\LevelSetList;
use Rector\Set\ValueObject\SetList;

return static function (RectorConfig $rectorConfig): void {
    // ルールを適用したいディレクトリを指定する
    $rectorConfig->paths([
        __DIR__ . '/app',
    ]);

// ここに適用したいルールを記述する
    $rectorConfig->sets([
        
        LevelSetList::UP_TO_PHP_82,
        SetList::CODE_QUALITY
    ]);
};

実行コマンドを打つと、指定したルール通りに、該当ディレクトリ以下のソースコードを変更してくれる!

vendor/bin/rector process

ざっくりどんなことができるのか?

公式ドキュメント読むとわかりやすいので詳しくはそっちを読んでほしい。

私がすごいと思ったのはこの辺りだ。

Tips

Tips1

  • RuleSetの一部ルールのみ適用することも可能

例えばDEAD_CODEルールのソースコードを読んでいると、たくさんのRectorクラスが適用されていることがわかる

このRectorクラスの中から一部のルールのみを適用することもできるので、かなりカスタマイズできる!

rector.php
<?php

declare(strict_types=1);


// use 宣言は省略

return static function (RectorConfig $rectorConfig): void {
    // ルールを適用したいディレクトリを指定する
    $rectorConfig->paths([
        __DIR__ . '/app',
    ]);

// ここに適用したいルールを記述する
 $rectorConfig->rules([
        UnwrapFutureCompatibleIfPhpVersionRector::class,
        RecastingRemovalRector::class,
        RemoveDeadStmtRector::class,
        RemoveDuplicatedArrayKeyRector::class,
        RemoveUnusedForeachKeyRector::class,
        RemoveParentCallWithoutParentRector::class,
        RemoveEmptyClassMethodRector::class,
        RemoveDoubleAssignRector::class,
        SimplifyMirrorAssignRector::class,
        RemoveUnusedPrivatePropertyRector::class,
        RemoveUnusedPrivateClassConstantRector::class,
        RemoveUnusedPrivateMethodRector::class,
        RemoveDeadReturnRector::class,
        RemoveDeadContinueRector::class,
        RemoveDeadIfForeachForRector::class,
        RemoveAndTrueRector::class,
        RemoveConcatAutocastRector::class,
        SimplifyUselessVariableRector::class,
        RemoveDuplicatedCaseInSwitchRector::class,
        RemoveNullPropertyInitializationRector::class,
        RemoveUnreachableStatementRector::class,
        SimplifyIfElseWithSameContentRector::class,
        TernaryToBooleanOrFalseToBooleanAndRector::class,
        RemoveDeadTryCatchRector::class,
        RemoveUnusedVariableAssignRector::class,
        RemoveUnusedNonEmptyArrayBeforeForeachRector::class,
        RemoveDeadConditionAboveReturnRector::class,
        RemoveUnusedConstructorParamRector::class,
        RemoveDeadInstanceOfRector::class,
        RemoveTypedPropertyDeadInstanceOfRector::class,
        RemoveDeadLoopRector::class,
        RemoveUnusedPrivateMethodParameterRector::class,
        // docblock
        RemoveUselessParamTagRector::class,
        RemoveUselessReturnTagRector::class,
        RemoveNonExistingVarAnnotationRector::class,
        RemoveUselessVarTagRector::class,
        RemoveUnusedPromotedPropertyRector::class,
        RemoveJustPropertyFetchForAssignRector::class,
        RemoveAlwaysTrueIfConditionRector::class,
        RemoveDeadZeroAndOneOperationRector::class,
        RemovePhpVersionIdCheckRector::class,
    ]);
};

Tips2

細かいルールどこで確認すれば良いのよ!って思うかもしれないがソースコード読むとわかりやすくSAMPLEが書いてある!

RemoveDoubleAssignRectorクラスを見てみる。

参考コード
スクリーンショット 2023-08-20 12.52.32.png

SAMPLE見る限り、重複している変数宣言があった場合に、重複を取り除いてくれるんだなとわかる。

まとめ

Rectorとても便利なライブラリで、夢中で調べてしまった!
CIに組み込むなどすることで、自動でコード整形してくれるようになるなど応用的な使い方も紹介されているので、有効利用していきたいところだ!

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?