ThinkPHP: 모델을 위한 세 가지 강력한 도구 중 세 번째(getter)

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

ThinkPHP: 모델을 위한 세 가지 강력한 도구 중 세 번째(getter)

getter 정의

getter의 기능은 모델 객체의 (원시) 데이터를 자동으로 처리하는 것입니다. getter는 모델의 특수 메소드에 해당합니다(메소드는 공개 유형이어야 함). 메소드 명명 규칙은 다음과 같습니다.

getFieldNameAttr

FieldName은 데이터 테이블 필드 또는 그렇지 않은 필드의 카멜 케이스 변환입니다. 데이터 테이블에 존재하는 경우(다음 문장을 이해해야 함) 다음은 일반적인 getter 정의입니다.

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    public function getUserTypeAttr($value, $data)
    {
        $type = [0 => &#39;普通&#39;, 1 => &#39;VIP&#39;, 2 => &#39;黄金&#39;, 3 => &#39;白金&#39;, 4 => &#39;钻石&#39;];
        return $type[$value];
    }
}
로그인 후 복사

출력 변환 처리가 필요한 각 데이터 필드에 대해 해당 getter를 정의해야 하지만 필드 이름은 getter는 데이터 테이블의 필드와 동일할 필요는 없습니다. 이름은 일관됩니다. 예를 들어, user_type 필드에 대해 getTypeAttr이라는 getter를 정의하려는 경우에도 허용됩니다. 이때 getter에 전달되는 첫 번째 매개변수에는 값이 없어야 합니다(해당하는 데이터 테이블 필드 데이터가 없기 때문). 두 번째 매개변수를 통해서만 필요한 데이터를 얻을 수 있습니다.

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    public function getTypeAttr($value, $data)
    {
        $type = [0 => &#39;普通&#39;, 1 => &#39;VIP&#39;, 2 => &#39;黄金&#39;, 3 => &#39;白金&#39;, 4 => &#39;钻石&#39;];
        return $type[$data[&#39;user_type&#39;]];
    }
}
로그인 후 복사

물론 더 엄격한 경우에는 $data['user_type']가 존재하는지 여부도 확인해야 하며 지금은 건너뜁니다.

두 번째 매개변수의 데이터 데이터 자체가 getter에 의해 처리되었을 수 있다는 점에 유의하세요(관련 getter를 정의한 경우).

데이터그램 필드와 일치하지 않는 getter를 정의해야 하는 이유는 무엇입니까? 가장 확실한 이점은 다양한 필드를 구별하여 원시 데이터와 처리된 데이터를 얻을 수 있다는 것입니다. 실제로 데이터 테이블에 존재하지 않는 일부 필드 게터를 정의하는 데는 여러 가지 이유가 있습니다. 이것이 바로 게터의 매력입니다.

게터의 정의 자체는 어렵지 않다고 볼 수 있는데, 핵심은 실제 응용에서 가장 주목해야 할 메소드의 획득 로직에 있습니다.

Getter 호출

getter를 정의한 후 다음 상황에서 자동으로 트리거됩니다.

·모델의 데이터 개체 값 작업(예: $model->field_name);

· 모델의 직렬화된 출력 작업(예: $model->toArray() 또는 toJson())

· 명시적으로 getAttr 메서드(예: $model-> getAttr('field_name'));

처음 두 개는 실제로 마지막 항목을 호출하여 구현됩니다. 가장 중요한 것은 첫 번째 항목을 이해하는 것입니다. 위의 방법을 사용하여 모델 객체 데이터를 얻거나 템플릿을 출력할 때 실제로는 다음과 같은 순서로 데이터를 감지하고 얻습니다.

·1단계 - 쿼리 결과에 필드 데이터가 포함된 경우 원본 데이터를 검색하고, 그렇지 않으면 2단계로 이동합니다.

·2단계 - 필드가 Getter(동적 포함)로 정의되었는지 확인합니다. getter), 있는 경우 getter를 호출하여 결과를 반환하고, 그렇지 않은 경우 3단계로 이동합니다.

·3단계 - 필드의 유형 변환이 정의되어 있는지 확인하고, 그렇다면 변환을 진행합니다. 처리하고 결과를 반환합니다. 그렇지 않으면 4단계로 이동합니다.

·4단계 - 시스템의 시간 필드인 경우 자동으로 시간 형식을 수행하고 결과를 반환합니다. 그렇지 않으면 5단계로 이동합니다. ·

5단계 - 1단계 확인에서 필드 데이터가 포함되지 않은 경우 연관된 속성 정의가 있는지 확인하고, 그렇다면 연관된 관계를 통해 데이터를 얻어서 결과를 반환하고, 그렇지 않으면 정의되지 않은 속성을 반환합니다. 비정상적으로 던져지게 됩니다.

위 5단계의 세부 코드는 관심 있는 분들은 thinkmodelconcernAttribute의 getAttr 메소드 코드를 직접 참고하시면 됩니다.

간단히 $user->user_type을 받으면 user_type 필드가 실제 데이터 테이블 필드인지 여부에 관계없이 해당 getter가 정의되어 있는지 확인하게 됩니다.

하지만 모델 데이터를 하나씩 가져오지 않고 전체 모델 데이터를 클라이언트나 템플릿으로 반환하는 경우가 많습니다.

$user = User::get(1);
echo $user->name;
echo $user->user_type;
로그인 후 복사
이 경우 출력에 응답할 때 모델의 toJson 처리가 실제로 수행됩니다.

한 가지 중요한 점은 getter가 데이터 테이블이 아닌 필드를 정의하는 경우 해당 필드가 자동으로 출력되지 않는다는 것입니다. 추가 메소드를 통해 추가 속성을 추가해야 합니다(그리고 관련 모델 속성 추가를 지원해야 합니다).

type 속성에 대한 getter를 정의하는 경우(실제 데이터 테이블 필드가 아니라고 가정) 다음 방법을 사용하여 정상적으로 출력해야 합니다(그렇지 않으면 user_type 데이터만 있을 수 있음):

public function index()
{
    $user = User::get(1);
    return json($user);
}
로그인 후 복사

toArray를 사용해도 처리는 동일합니다.

데이터 세트 쿼리인 경우 추가 필드를 균일하게 추가하기 위해 추가 메서드를 사용할 수도 있습니다.

public function index()
{
    $user = User::get(1);
    return json($user->append([&#39;type&#39;]));
}
로그인 후 복사

append 방식 외에도 숨겨진 방식을 사용하여 일부 데이터를 일시적으로 숨기는 기능도 지원합니다.

원시 데이터 가져오기

有些情况下,除了要获取处理过的数据外,还需要获取原始数据以便应对不同的需求。

如果你的获取器都是用的区分于实际数据表字段的额外属性字段,那么这个问题本身已经解决了。所以我们主要讨论的是当你的获取器属性和数据表字段一致的情况下,该如何获取原始数据。

一个最简单的办法是使用getData方法:

$user = User::get(1);
// 获取user_type获取器数据
echo $user->user_type;
// 获取原始的user_type数据
echo $user->getData(&#39;user_type&#39;);
// 获取全部原始数据
dump($user->getData());
로그인 후 복사

动态获取器

前面我们提到过动态获取器的概念,动态获取器就是不需要在模型类里面定义获取器方法,而是在查询的时候使用闭包来定义一个字段的获取器对数据进行统一的处理。

User::withAttr(&#39;name&#39;, function($value, $data) {
return strtolower($value);
})->select();
로그인 후 복사

如果你需要定义多个动态获取器,多次调用withAttr方法就行。

动态获取器的意义除了可以不用在模型里面定义获取器方法之外,还可以起到覆盖已经定义的获取器的作用,并且动态获取器可以支持Db类操作,弥补了Db操作不能使用获取器的缺憾,具体就看自己的需求来选择了。

Db::name(&#39;user&#39;)->withAttr(&#39;name&#39;, function($value, $data) {
return strtolower($value);
})->select();
로그인 후 복사

总结

无论是获取器,还是之前提的修改器、搜索器,其作用无非是把你的模型工作细化和拆分,这样代码和逻辑也会更清晰,可维护性也大大增强,至于性能,从来不是模型首先考虑的。

PHP中文网,有大量免费的ThinkPHP入门教程,欢迎大家学习!

本文转自:https://blog.thinkphp.cn/825350

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

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