리팩토링 #6: Rector를 사용하여 Laravel의 코드 품질 향상

나는 최근에 Rector를 발견했고 그 힘과 효율성에 완전히 매료되었습니다. 약속은 간단합니다. 패키지를 설치하고 실행하면 즉시 자동 업그레이드 및 리팩토링이 제공됩니다.

젠장, 대담하네. 나는 내 프로젝트 중 하나에 그것을 실행하면서 생각했다. getrector.org에서 그들의 첫 번째 페이지 지침을 읽는 동안 나는 가능한 한 밤새 전체 프로젝트에 뛰어들어 리팩토링하기로 결정했습니다.

저는 PHP 7.4 환경에서 Laravel 8 프로젝트를 실행하고 있으며 간단한 코드 품질 개선을 처리하는 다음과 같은 간단한 구성으로 시작했습니다.

return static function (RectorConfig $rectorConfig): void {
    $rectorConfig->paths([
        __DIR__ . '/app'
    ]);

    $rectorConfig->importNames();

    $rectorConfig->sets([
        LevelSetList::UP_TO_PHP_74,
        SetList::CODE_QUALITY,
    ]);
};


위의 코드를 이해하지 못하더라도 걱정하지 마십시오. 저는 30분 전에도 이해하지 못했습니다 😂.
vendor/bin/rector --dry-run 를 실행한 후, 어쨌든 직접 수행하지 않을 작은 업그레이드를 즉시 확인했습니다.

클래스 이름 자동 가져오기




     /**
-     *
-     * @return \Illuminate\Broadcasting\Channel|array
-     */

+     *
+     * @return Channel|array
+     */
     public function broadcastOn()


이 변경 사항은 $rectorConfig->importNames(); 구성에서 제공되며 생명의 은인입니다. 대부분의 코딩 표준은 짧은 클래스 이름을 선호하므로 전체 프로젝트에서 클래스를 자동으로 가져오는 것이 큰 도움이 됩니다.

문자열 클래스 이름을 클래스 상수로 변경




    public function user() {
-      return $this->belongsTo('App\User');

+      return $this->belongsTo(User::class);
     }


이것은 대부분이 오늘날까지 여전히 문자열 버전을 사용하기 때문에 오래된 Laravel 프로젝트에 환상적입니다. IDE가 User::class 버전을 훨씬 더 잘 지원하기 때문에 훌륭한 업그레이드입니다.

PHP 7.4의 화살표 함수




       $schedule->command('dummy-command')
         ->daily()

-        ->when(function () {
-          return \Carbon\Carbon::now()->endOfWeek()->isToday();
-        });

+        ->when(fn() => Carbon::now()->endOfWeek()->isToday());


화살표 함수가 PHP 7.4에 도입된 것도 몰랐고 언어 업그레이드 없이도 사용할 수 있었습니다. 이제 나는 단일 교장 명령으로 그들의 힘을 활용할 수 있습니다.

인라인 쓸모없는 변수




-        $phone = str_replace(' ', '', $phone);
-        return $phone;

+        return str_replace(' ', '', $phone);


이것은 또 다른 낮은 매달린 과일입니다. 여기서 $phone 변수는 코드 품질에 아무 것도 추가하지 않으므로 안전하게 제거할 수 있습니다.

대입 연산자 결합




-        $this->order_count = $this->order_count + 1;

+        $this->order_count += 1;


이것도 쉬운편입니다. 제 생각에는 짧은 버전이 항상 더 좋습니다.

if return 문을 단순화하십시오.




-        if ($user->company_id == $this->id) {
-            return true;
-        }
-
-        return false;


+        return $user->company_id == $this->id;


나는 당신이 거의 항상 이것을 하고 싶어한다고 생각합니다. 그것은 눈에 보기 쉽고 논리를 더 빨리 이해하는 데 도움이 되는 아름다운 한 줄짜리입니다.
그러나 기존 방법이 더 적합한 파일 중 하나에서 서식이 손상되는 경우 다음과 같은 주석을 추가하여 이 규칙을 무시할 수 있습니다.
/** @noRector \Rector\CodeQuality\Rector\If_\SimplifyIfReturnBoolRector */ .

JSON 작업에서 오류 발생




     public function setImageUrlsAttribute($value)
     {
-        $this->attributes['image_urls'] = json_encode($value);

+        $this->attributes['image_urls'] = json_encode($value, JSON_THROW_ON_ERROR);
     }


이 추가 매개변수를 사용하면 JSON 인코딩 또는 디코딩이 잘못될 때 반환되지 않고null 대신 예외가 발생합니다. 나는 이것이 마음에 들지만 아직 내 코드에서 이 최적화를 수행할 준비가 되었는지 완전히 확신할 수 없습니다. 이것은 예외를 던지기 때문에 약간 지쳐서 나중에 저장하겠습니다.

this configuration 을 사용하여 특정 규칙을 무시할 수 있습니다.

압축 용도를 배열로 변환




         $user= auth()->user();
         $credits= $user->credits()->latest()->get();

-        return view('user.credits', compact('user', 'credits'));


+       return view('user.credits', ['user' => $user, 'credits' => $credits]);


오늘 저는 it's not ideal 을 나타내는 compact() 함수와 반패턴을 사용하는 것에 대한 의견이 있다는 것을 배웠습니다. 이것에 대해 어떻게 생각하는지 잘 모르겠지만 이 리팩토링을 유지하고 흐름을 따라 가고 있습니다. 평범한 오래된 배열에는 아무런 문제가 없습니다. 맞습니까?

실제로 다른 많은 작은 업그레이드도 있습니다. 이것은 위에서 한 줄로 가져온 CODE_QUALITY 규칙에서 온 것임을 잊지 마십시오. 30+ other categories이 있어 사용하고 그들이 무엇을 제공하는지 보고 싶습니다.

이 시점에서 vendor/bin/rector를 실행하면 모든 테스트가 여전히 통과, 커밋, 푸시 및 배포됩니다. 지금은 모두 잘 생산되고 있습니다 😁.

좋은 웹페이지 즐겨찾기