[Laravel/Eloquent] Accessor 사용을 피해야 하는 이유는 무엇입니까?

안녕하세요 라라벨 개발자 여러분,

아시다시피 Laravel의 Eloquent는 "getter"를 생성하고 원하는 대로 데이터를 변환/액세스할 수 있는 멋진 방법을 제공합니다. 예시:

// App/Models/User 

public function getFullNameAttribute(): string
{
    return sprintf('%s %s', $this->first_name, $this->last_name);
}

// Seth Phat
$user->full_name;


멋지지 않나요?

그러나 가능한 한 빨리 피해야 합니다. 이유는 다음과 같습니다.

1/ 테이블 열 간의 충돌



위의 예와 같이 접근자와 테이블의 열을 구분할 수 없습니다. 데이터에 액세스하는 방법은 너무 비슷합니다.

프로젝트가 성장하면 점점 더 많은 기능이 추가되고 접근자를 과도하게 사용하면 코드베이스에 큰 문제가 발생합니다.
  • 코드에서 열과 접근자 간의 차이를 구분할 수 없습니다.
  • 유지 관리 및 기술 부채가 급증할 것입니다.
  • 새로운 사람들이 코드, 논리 등을 읽을 때 혼동을 줍니다.
  • 무엇인지 확인하려면 항상 SQL 관리자(예: TablePlus)를 열어야 합니다.
  • ...

  • 2/ 수동으로 phpDoc 유지



    접근자가 많을수록 Model 클래스의 phpDoc을 유지 관리하는 데 더 많은 시간이 걸립니다.

    IDE 친화적으로 만들려면 코드 제안,... 접근자를 클래스의 phpDoc에 추가해야 합니다. 예를 들면 다음과 같습니다.

    /**
    * @property-read string $full_name // Accessor
    * @property-read string $sex // Accessor
    */
    


    10개의 접근자를 생성했다고 가정하면 10번 추가해야 합니다. 또는 더 이상 필요하지 않은 경우 접근자와 문서 속성을 모두 제거해야 합니다.

    재미없어, IKR?

    3/ 모의하기 어렵다



    TDD가 실행되면 테스트를 작성하고 싶을 것입니다. Eloquent 모델을 조롱하고 싶습니다. 조롱하는 과정 자체가 큰 고통입니다.

    Eloquent는 액세스하려는 속성을 확인한 다음 __get() 매직 메소드를 통해 데이터를 반환합니다. 조롱하기:

    $user = $this->createMock(User::class):
    $user->expects($this->exactly(3))
        ->method('__get')
        ->willReturnOnConsecutiveCalls(
            'Seth Phat', // full_name
            'Male', // sex
            // ... more and more
         );
    


    그리고 나는 아무도 위의 조롱 과정을 좋아하지 않을 것이라고 믿습니다. 유지하기가 매우 어렵습니다.

    그래서 무엇을 사용해야합니까?



    좋은 getter 방법은 완벽합니다. IDE 친화적이고 phpDoc을 유지 관리할 필요가 없으며 모의하기가 매우 쉽습니다.

    public function getFullName(): string
    {
        return sprintf('%s %s', $this->first_name, $this->last_name);
    }
    


    모조품:

    $user = $this->createMock(User::class):
    $user->expects($this->once())
        ->method('getFullName')
        ->willReturn('Seth Phat');
    // mock more...
    


    이러한 조롱 프로세스를 통해 쓰기 테스트는 완전히 즐겁고 유지 관리가 쉽습니다.

    한정


  • 사용할 수 없음 appends & hidden
  • 또는 전체 Eloquent 모델을 반환하는 대신 Laravel's Resource 응답을 사용할 수 있으며 이 방법을 선호합니다
  • .


    결정적인



    이것이 제 경험입니다. 너희들은 어때?

    건배!

    좋은 웹페이지 즐겨찾기