Accessor는 엘로퀀트 모델에서 프로퍼티를 조회할 때 전처리를 하는 기능입니다. 아래는 매뉴얼에 나오는 예제 코드입니다.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Get the user's first name.
*
* @param string $value
* @return string
*/
public function getFirstNameAttribute($value)
{
return ucfirst($value);
}
}
$user = App\User::find(1);
// name에 sally 라고 저장되어 있음
$firstName = $user->first_name;
// ucfirst()가 적용되어 Sally가 출력됨
Accessor가 적용된 프로퍼티의 원본 값이 필요할 때가 있습니다. 매뉴얼에는 Accessor를 사용하는 방법만 나오고 원본 값에 접근하는 방법은 따로 안내가 되어 있지 않네요.(엘로퀀트 모델의 프로퍼티에 값을 설정할 때 전처리하는 Mutator 예제에서 볼 수 있긴 합니다.)
결론부터 말씀드리면 attributes
프로퍼티를 활용하면 됩니다. name
프로퍼티를 사용하려고 하는 경우, 모델 내부에서 사용할 때는 $this->attributes['name']
로 접근하면 accessor를 우회할 수 있습니다. attributes
는 protected 프로퍼티이기 때문에 외부에서는 직접 접근할 수 없습니다. 외부에서 접근할 때는 $model->attributes()['name']
과 같이 하시면 됩니다.
비슷한 기능을 하는 getOriginal()
이 있습니다. 비슷하지만 전혀 다르게 동작하므로 주의하세요. getOriginal()
는 저장소에서 가져온 원본 값을 반환해줍니다.
$user = User::where('name', '변경전 이름')->first();
$user->name = '새로운 이름';
dump($user->getAttributes()['name']);
// '새로운 이름'이 출력됨
dump($user->getOriginal('name'));
// '변경전 이름'이 출력됨
1일 1식 라라벨 68호
2019년 10월 8일
메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 처음부터 제대로 배우는 라라벨(Laravel Up & Running 2nd Edition)을 번역했습니다.