ThinkPHP: 모델을 위한 세 가지 강력한 도구 중 두 번째(수정자)

爱喝马黛茶的安东尼
풀어 주다: 2019-12-16 17:01:07
앞으로
2696명이 탐색했습니다.

ThinkPHP: 모델을 위한 세 가지 강력한 도구 중 두 번째(수정자)

수정자는 모델의 가장 강력한 세 가지 "도구" 중 하나입니다. 이 글에서는 수정자의 사용법과 몇 가지 주의 사항을 요약하겠습니다.

수정자 정의

수정자의 기능은 모델 객체 데이터가 데이터베이스에 기록되기 전에 필요한 데이터 처리를 수행하는 것입니다. 수정자의 표준 정의는 다음과 같습니다.

public function setFieldNameAttr($value, $data)
{
    // 对value值进行处理 data参数是当前全部数据
    // 返回值就是实际要写入数据库的值
    return $value;
}
로그인 후 복사

여기서 FieldName은 데이터 테이블의 field_name 필드(테이블 필드의 데이터 사양과 수정자 메서드는 사양을 정의합니다. 그렇지 않으면 오류가 발생합니다).

각 수식자는 원칙적으로 해당 필드의 데이터만 처리해야 하지만, 필요한 경우 동시에 여러 필드를 처리하는 것도 허용됩니다.

다음은 예시입니다

public function setBirthdayAttr($value, $data)
{
    // 格式化生日数据
    $birthday = strtotime($value);
    // 根据生日判断年龄
    $age = getAgeByBirthday($birthday);
    // 赋值年龄数据
    $this->setAttr('age', $age);
    return $birthday;
}
public function setAgeAttr($value,$data)
{
    return floor($value);
}
로그인 후 복사

setAttr 메소드를 사용하는 이유는 연령 할당 작업이 별도의 수정자를 거칠 수 있도록 하기 위함입니다. 추가 수식어가 없으면

public function setBirthdayAttr($value, $data)
{
    // 格式化生日数据
    $birthday = strtotime($value);
    // 根据生日判断年龄
    $age = getAgeByBirthday($birthday);
    // 赋值年龄数据
    $this->data['age'] = $age;
    return $birthday;
}
로그인 후 복사

로 쓸 수도 있습니다. 모델 내부에 데이터 객체를 할당하면 모델의 내부 속성과 혼동되어 예측할 수 없는 결과가 발생하므로

$this->age = $age;
로그인 후 복사

로 쓰면 안 됩니다. 모델.

특정 수정자에서 다른 필드를 수정할 수 있는 경우 추가로 수정해야 하는 필드 수정자가 할당되어 있어야 함(또는 수정자가 트리거됨)을 기억하세요.

호출 방법

수정자 메소드는 정의 사양에 따라 정의된 후 다음과 같은 상황에서 자동으로 호출됩니다.

·모델 객체

· 모델의 데이터 메소드를 호출하고 두 번째 매개변수로 true를 전달합니다.

·모델의 저장 메소드를 호출하고 배열 데이터를 전달합니다.

모델의 setAttr 메소드를 명시적으로 호출합니다.

·

이 필드의 자동 완성을 정의합니다.

예를 들어, User 모델은 setPasswordAttr 수정자 메소드를 정의합니다.

public function setPasswordAttr($value, $data)
{
    return md5($value);
}
로그인 후 복사
이렇게 사용하면 데이터베이스에 저장된 비밀번호 필드의 값이 md5('생각') 이후의 값이 됩니다.
$user = User::get(1);
$user->password = 'think';
$user->save();
로그인 후 복사

수정자를 사용하고 싶지 않지만 경우에 따라 데이터를 수동으로 제어하고 싶다면 다음 방법을 시도해 볼 수 있습니다.

$user = User::get(1);
$user->data('password', md5('think'));
$user->save();
로그인 후 복사

현재는 수식어로 처리되지 않습니다.

충돌 방지

많은 개발자는 수정자에 대해 자동 완성 자동(삽입 및 업데이트 포함)을 정의하는 것을 좋아합니다.

protected $auto = ['password'];
로그인 후 복사
V5.1.27 이전 버전에서는 영리해 보이지만 매우 치명적인 실수입니다. 이전에 제공한 수정자 트리거 조건에 따라 수정자가 두 번 실행될 수 있으므로 피하세요. 이는 심각한 오류가 발생하여 모든 사용자가 등록 후 정상적으로 로그인할 수 없게 됩니다.

해결책은 값이 할당될 때마다 수정자가 자동으로 실행되므로 비밀번호 필드의 자동 완성 설정을 취소하는 것입니다. 할당이 없으면 비밀번호가 수정되지 않았음을 의미하며 비밀번호가 없습니다. 자동 완성.

자동 완성 필드는 일반적으로 양식에 없는 필드이며 일반적으로 시스템에서 자동으로 처리되는 필드입니다.

V5.1.27 버전에서는 이 문제가 개선되었습니다. 모든 수정자는 한 번만 실행될 수 있으며 위의 문제는 더 이상 존재하지 않습니다. 그러나 이는 새로운 문제를 가져온 것 같습니다. 모델이 발생하면 데이터를 수정하고 싶을 수도 있습니다.

User::beforeUpdate(function($user) {
    $user->password = md5('think');
});
로그인 후 복사

는 모델 beforeUpdate 이벤트에서 데이터 값을 수정할 수 없음을 발견합니다. 그 이유는 모델의 수정자가 첫 번째 할당 중에 실행되었고 두 번째 할당 시 유효하지 않기 때문입니다(아니오가 실행되지 않음). 다시).

해결책은 데이터 할당 작업을 위해 수정자를 호출하지 않고 앞서 언급한 데이터 메서드를 사용하는 것입니다.

User::beforeUpdate(function($user) {
    $user->data('password', md5('think'));
});
로그인 후 복사

물론 더 나은 제안은 수정자, 자동 완성 및 모델 이벤트의 데이터 처리 메커니즘을 계획하는 것입니다. 필드에 대해 동시에 데이터를 수정하기 위해 여러 메커니즘을 사용하지 마십시오. 데이터베이스에 기록된 데이터는 수정자를 통해 작성됩니다.

자동 유형 변환

수정자가 데이터에 대한 유형 변환만 수행하는 경우 수정자를 정의할 필요가 없으며 필드 유형을 직접 정의하면 됩니다.

public function setScoreAttr($value, $data)
{
    return (float) $score;
}
로그인 후 복사
위 수식자 방식은
protected $type = [
    'score'    =>    'float',
];
로그인 후 복사
로 직접 변경할 수 있습니다. 수식자와 필드 유형을 동시에 정의하면 수식자가 우선 적용됩니다.

유형 정의는 간단한 데이터 유형을 정의할 수 있을 뿐만 아니라 몇 가지 추가 용도도 있습니다. 예를 들어 json 유형, 배열 유형 및 객체 유형은 JSON 직렬화되고 직렬화 유형은 데이터를 직렬화합니다.

PHP 중국어 웹사이트에는 무료

ThinkPHP 입문 튜토리얼

이 많이 있습니다. 누구나 배울 수 있습니다!

이 기사는 https://blog.thinkphp.cn/817548

에서 복제되었습니다.

위 내용은 ThinkPHP: 모델을 위한 세 가지 강력한 도구 중 두 번째(수정자)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:thinkphp.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿