[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/ 테이블 열 간의 충돌
위의 예와 같이 접근자와 테이블의 열을 구분할 수 없습니다. 데이터에 액세스하는 방법은 너무 비슷합니다.
프로젝트가 성장하면 점점 더 많은 기능이 추가되고 접근자를 과도하게 사용하면 코드베이스에 큰 문제가 발생합니다.
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
결정적인
이것이 제 경험입니다. 너희들은 어때?
건배!
Reference
이 문제에 관하여([Laravel/Eloquent] Accessor 사용을 피해야 하는 이유는 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sethsandaru/laraveleloquent-why-you-should-avoid-using-accessors-nk텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)