Accessor 은 모델에서 데이타를 가져올때 자동으로 속성을 변환하는 기능이며 Mutator 는 모델에 데이타를 입력할 때 자동으로 속성값을 설정하는 기능입니다.


예로 모델 이벤트에서 설명한 사용자에게 폼을 통해 입력받은 개인 정보를 모델에 넣을 때 자동으로 암호화하고 모델에서 데이타를 읽을 때 자동으로 복호화하게 할 수 있습니다.


이 절의 예제를 실행하기 전에 먼저 전 절의 모델 이벤트에서 App/Providers/AppServiceProvider.php 파일의 boot() 메소드에 등록한 creating() 이벤트를 삭제합니다.

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
       
    }
PHP


Mutator 만들기

적용할 컬럼 이름이 Foo 일 경우 모델내 메소드명을 setFooAttribute() 로 작성하면 Eloquent 는 자동으로 해당 메소드를 Mutator로 처리합니다. 컬럼명은 꼭 카멜 케이스로 해야 하며 실제 데이타베이스의 컬럼이 snake_case 라도 카멜 케이스를 사용해야 합니다.(라라벨 헬퍼 함수중 camel_case() 를 사용하여 입력된 문자를 카멜 케이스로 변환하면 됩니다.)


   /**
     * 입력한 account 컬럼을 암호화
     * @param type $value 계좌 정보 컬럼
     */
    public function setAccountAttribute($value)
    {
         $this->attributes['account'] = \Crypt::encrypt($value);
    }
PHP

모델에는 account 라는 변수가 없으나 $user->account 처럼  사용할 수 있는 것은 PHP 의 오버로딩을 사용하여 실행 시점에 클래스에 없는 프로퍼티를 참고할 경우 배열에 key/value 를 만들고 value을 전달해 주어서 입니다.

그러므로 Mutator 에서는 $this->account 처럼 사용할 수 없으며 $this->attributes 배열의 키에 프로퍼티 이름을 넣어주어야 합니다.


mutator 사용은 프로퍼티 처럼 사용하면 됩니다.

$u = new \App\User;
$u->account = '1234567890';
PHP


Accessor 만들기

Mutator 와는 set 대신 get 을 사용하는 것만 제외하고는 동일한 작업을 수행하면 됩니다.


이제 User 모델의 암호화된 account 컬럼을 accessor 를 사용하여 자동으로 복호화하려면 app/User.php 에 accessor 메소드를 정의하며 이름은 규칙에 맞게 getAccountAttribute() 로 지정합니다.

   /**
     * 암호화된 account 컬럼을 복호화
     * @param type $value 암호화된 컬럼
     * @return type 복호화된 컬럼
     */
    public function getAccountAttribute($value)
    {
        return \Crypt::decrypt($value);
    }
PHP

accessor 를 사용할 경우도  -> 연산자를 사용하여 프로퍼티처럼 사용하면 됩니다.

$user = App\User::find(1);

$account = $user->account;
PHP


이제 실제 동작 테스트를 위해  Orm 컨트롤러에 테스트용 메소드를 만들 차례입니다.

public function getMutatorTest()
{
	// 입력시 mutator 자동 호출
    $u1 = \App\User::create([
        'name'=>'Test',
        'account' => '1234567890',
        'email' => 'test@host.com',
        ]);
    // 사용자 정보 덤프
    dump($u1);

    $u2 = \App\User::find($u1->id);
    // accessor 호출
    dump($u2->account);
}
PHP


이제 브라우저에서 http://homestead.app/orm/mutator-test 에 연결해 보면 첫 번째 User 모델에서 account 에 '1234567890' 을 할당했으나 mutator 에 의해 암호화 된 것을 확인할 수 있으며 데이타베이스에서 가져온 모델의 프로퍼티에 접근할 때 accessor 이 호출되어 복호화를 수행하여 원본 값을 가져온 것을 알수 있습니다.





Eloquent 의 관례중 $dates 배열에 정의한 컬럼은 자동으로 Carbon 클래스로 변환되는 것도 바로 Accessor 와 Mutator 를 사용하여 구현된 것으로 자동 속성 변환이 필요한 경우 아주 유용하게 사용할 수 있습니다.