68호. Accessor 우회하기 free

2019-10-08

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를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.