찾다
PHP 프레임워크ThinkPHPThinkPHP: 모델을 위한 세 가지 강력한 도구 중 세 번째(getter)

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官网에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
ThinkPhp의 내장 테스트 프레임 워크의 주요 기능은 무엇입니까?ThinkPhp의 내장 테스트 프레임 워크의 주요 기능은 무엇입니까?Mar 18, 2025 pm 05:01 PM

이 기사는 ThinkPhp의 내장 테스트 프레임 워크에 대해 논의하여 장치 및 통합 테스트와 같은 주요 기능과 조기 버그 감지 및 개선 된 코드 품질을 통해 응용 프로그램 신뢰성을 향상시키는 방법을 강조합니다.

실시간 주식 시장 데이터 피드 구축에 ThinkPhp를 사용하는 방법은 무엇입니까?실시간 주식 시장 데이터 피드 구축에 ThinkPhp를 사용하는 방법은 무엇입니까?Mar 18, 2025 pm 04:57 PM

기사는 실시간 주식 시장 데이터 피드에 ThinkPHP를 사용하여 설정, 데이터 정확도, 최적화 및 보안 측정에 중점을 둡니다.

서버리스 아키텍처에서 ThinkPhp를 사용하는 데있어 주요 고려 사항은 무엇입니까?서버리스 아키텍처에서 ThinkPhp를 사용하는 데있어 주요 고려 사항은 무엇입니까?Mar 18, 2025 pm 04:54 PM

이 기사는 서버리스 아키텍처에서 ThinkPHP를 사용하기위한 주요 고려 사항에 대해 설명하고 성능 최적화, 무국적 설계 및 보안에 중점을 둡니다. 비용 효율성 및 확장 성과 같은 혜택을 강조하고 도전 과제를 해결합니다.

ThinkPHP 마이크로 서비스에서 서비스 검색 및로드 밸런싱을 구현하는 방법은 무엇입니까?ThinkPHP 마이크로 서비스에서 서비스 검색 및로드 밸런싱을 구현하는 방법은 무엇입니까?Mar 18, 2025 pm 04:51 PM

이 기사에서는 ThinkPHP 마이크로 서비스에서 서비스 검색 및로드 밸런싱 구현, 설정, 모범 사례, 통합 방법 및 권장 도구에 중점을 둡니다. [159 문자]

ThinkPhp의 종속성 주입 컨테이너의 고급 기능은 무엇입니까?ThinkPhp의 종속성 주입 컨테이너의 고급 기능은 무엇입니까?Mar 18, 2025 pm 04:50 PM

ThinkPhp의 IOC 컨테이너는 PHP apps.character 수 : 159의 효율적인 종속성 관리를위한 게으른 하중, 맥락 바인딩 및 메소드 주입과 같은 고급 기능을 제공합니다.

실시간 협업 도구를 구축하는 데 ThinkPhp를 사용하는 방법은 무엇입니까?실시간 협업 도구를 구축하는 데 ThinkPhp를 사용하는 방법은 무엇입니까?Mar 18, 2025 pm 04:49 PM

이 기사는 ThinkPhp를 사용하여 실시간 협업 도구를 구축하고 설정, WebSocket 통합 및 보안 모범 사례에 중점을 둡니다.

SaaS 애플리케이션 구축에 ThinkPhp를 사용하면 어떤 주요 이점이 있습니까?SaaS 애플리케이션 구축에 ThinkPhp를 사용하면 어떤 주요 이점이 있습니까?Mar 18, 2025 pm 04:46 PM

ThinkPhp는 가벼운 디자인, MVC 아키텍처 및 확장 성을 통해 SaaS 앱에 혜택을줍니다. 다양한 기능을 통해 확장 성을 향상시키고 개발 속도를 높이며 보안을 향상시킵니다.

ThinkPHP 및 RabbitMQ로 분산 작업 대기열 시스템을 구축하는 방법은 무엇입니까?ThinkPHP 및 RabbitMQ로 분산 작업 대기열 시스템을 구축하는 방법은 무엇입니까?Mar 18, 2025 pm 04:45 PM

이 기사는 설치, 구성, 작업 관리 및 확장성에 중점을 둔 ThinkPhp 및 RabbitMQ를 사용하여 분산 작업 큐 시스템을 구축합니다. 주요 문제는 고 가용성 보장, 손상과 같은 일반적인 함정을 피하는 것입니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는