2014-11-27 4 views
6

이전에 ORM은 특정 속성에 대한 액세스를 제한하는 것처럼 특정 속성 표시를 허용하는 클래스 속성에 데이터베이스 열을 직접 매핑했습니다. 암호.Laravel/Eloquent 모델 속성 가시성

Eloquent와 함께 나는 데이터베이스 열이 가시성을 포함하지 않는 내부 속성 배열에 매핑되기 때문에 이것을 복제 할 수 없습니다.

사용자 암호에 대한 액세스 범위를 개체 (예 : 개인)로만 제한하고자합니다.

클래스 속성을 가시성으로 설정하면이 속성이 Eloquent 모델 특성의 범위 밖에 있으므로 속성이 열에 매핑되지 않으므로 작동하지 않습니다.

Eloquent $ hidden 및 $ guarded 속성은 직접 출력이 아닌 대량 출력 (toArray, toSSON) 및 질량 할당을 처리하므로 작동하지 않습니다.

나는 혼합 된 결과를 얻기 위해 접근 자/변경자 (getters/setters)를 사용하려고 시도했다.

Eloquent \ Model-> getAttribute 메서드에서 호출 된 접근 자 메서드 (예 : getPasswordAttribute)가 public/protected가 항상 작동하고 private가 항상 관계없이 실패하기 때문에 접근 자에 대한 가시성 지정이 작동하지 않습니다. 그것으로부터 액세스 한 속성

그러나 Eloquent 접근자가 속성을 모두 반환하는 것을 중지하면 $ user-> password 또는 $ user-> getAttribute ('password')에 대한 요청이 실패하고 다음으로 정의 된 가시성을 가진 별도의 메소드가 있습니다. Eloquent 속성 배열에서 직접 허용 된 범위에서만 속성을 직접 반환합니다.

/** 
* Return password string only for private scope 
* @return string 
*/ 

private function getPassword() 
{ 
    return $this->attributes['password']; 
} 

/** 
* Don't return password with accessor 
* @param string $password Password 
* @return void 
* @throws Exception 
*/ 

public function getPasswordAttribute ($password) 
{ 
    throw new Exception ('Password access denied'); 
} 

이 동일한 접근법은 setter 메소드 가시성을 원하는 모든 사람을위한 뮤 테이터 (설정자)에도 적용됩니다.

이 모양이 맞습니까? 아니면 이것을 처리하는 "Laravel-Approved"방법이 더 좋습니까? :)

+2

'hidden'은 array/json으로 모델을 출력하는 데 사용됩니다. 그것을 처리하는 'laravel'방식이 없으며 왜 그걸 원하니? –

+0

나는 숨어서 당신이 여전히 컨트롤러에서 (그가 생각하는) $ user-> password를 할 수 있다는 것을 확신한다. –

답변

2

나는 이렇게하는 '승인 된'방법을 알지 못하지만 개인 필드를 확인하기 위해 Eloquent의 __get() 마법 방법을 항상 무시할 수 있습니까?

debug_backtrace() 수표는 약간 해킹 된 것입니다. getPassword() 메서드 (또는 기본적으로 을 호출하는 해당 클래스의 메서드)가 여전히 __get을 사용하고 있었기 때문에 예상대로 작동하지 못했습니다. 이것은 단지 __get을 호출하는 클래스가 다른 클래스가 아닌 클래스 자체인지 확인합니다.

어쨌든 backtrace를 수행하기 전에 비공개 속성에서 in_array 검사가 실패하므로 너무 비효율적이어서는 안됩니다. 그래도 아마 더 좋은 방법 일 것입니다!

private $private = array(
    'password' 
); 

public function __get($key) 
{ 
    // check that the class calling __get is this class, and the key isn't 'private' 
    if (in_array($key, $this->private) && debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['class'] != get_class()) { 
     throw new \Exception('Private'); 
    } 

    // anything else can return as normal 
    return parent::__get($key); 
} 

public function getPassword() 
{ 
    // calling this method elsewhere should work 
    return $this->password; 
}