検索
ホームページPHPフレームワークThinkPHPThinkPHP: モデル用の 3 つの強力なツールのうちの 2 番目 (修飾子)

ThinkPHP: モデル用の 3 つの強力なツールのうちの 2 番目 (修飾子)

モディファイアはモデルの三大「ツール」の一つですが、今回はモディファイアの使い方と注意点をまとめます。

モディファイアの定義

モディファイアの機能は、モデル オブジェクト データがデータベースに書き込まれる前に、必要なデータ処理を実行することです。モディファイアの標準定義は、

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;

として記述しないでください。モデルの内部属性との混同、予見される結果。

特定のモディファイアの他のフィールドを変更する可能性がある場合は、追加で変更する必要があるフィールド モディファイアが割り当てられている (またはそのモディファイアがトリガーされている) 必要があることに注意してください。

呼び出し方法

修飾子メソッドは、定義仕様に従って定義されると、手動で呼び出す必要はなく、システムが自動的に呼び出します。次の状況:

·モデル オブジェクトの割り当て;

·データ メソッドを呼び出します。モデル、2 番目のパラメーターは true で渡されます;

# ·モデルの save メソッドを呼び出し、配列データを渡します;

·モデルの setAttr メソッドを明示的に呼び出します。

· このフィールドの自動補完を定義します。

たとえば、User モデルは setPasswordAttr 変更デバイス メソッドを定義します。

public function setPasswordAttr($value, $data)
{
    return md5($value);
}

次のように使用すると、データベースに保存されるパスワードフィールドの値は、md5('think') 以降の値になります。

$user = User::get(1);
$user->password = 'think';
$user->save();

修飾子を使用したくないが、場合によってはデータを手動で制御したい場合は、次の方法を試すことができます。

$user = User::get(1);
$user->data('password', md5('think'));
$user->save();

現時点ではモディファイアによって処理されません。

競合の回避#​​##多くの開発者は、修飾子のオートコンプリート auto (挿入と更新を含む) を定義することを好みます。

protected $auto = ['password'];

これは、一見賢いように見えますが、V5.1.27 より前の非常に致命的な間違いです。以前に指定したモディファイアのトリガー条件に従って、モディファイアが 2 回実行されることになるため、これを避けるようにしてください。これは致命的なエラーとなり、すべてのユーザーが登録後に正常にログインできなくなります。

解決策値が割り当てられるたびに修飾子が自動的にトリガーされるため、パスワード フィールドの自動補完設定をキャンセルします。割り当てがない場合は、パスワードが変更されていないことを意味します。自動完了はありません。

オートコンプリート フィールドは通常、フォームにないフィールドであり、通常はシステムによって自動的に処理されるフィールドです。

V5.1.27 バージョンではこの問題が改善され、すべてのモディファイアは 1 回のみ実行できるようになり、上記の問題はなくなりました。しかし、これにより新たな問題が発生したようです。モデルのイベントでデータを変更する必要が生じることがよくあります。

User::beforeUpdate(function($user) {
    $user->password = md5('think');
});

モデルの beforeUpdate イベントでは、データの値を変更できないことがわかります。その理由は、モデルのモディファイアが最初の割り当て中に実行され、2 番目の割り当て中に実行されているためです。無効です (再度実行されません)。

解決策は、前に述べたように、データ割り当て操作の修飾子を呼び出さずに data メソッドを使用することです。

User::beforeUpdate(function($user) {
    $user->data('password', md5('think'));
});

もちろん、より良い提案は、修飾子、オートコンプリート、およびモデル イベントのデータ処理メカニズムを計画することです。フィールドのデータを同時に変更するために複数のメカニズムを使用しないでください。データ変更操作は、このメソッドを通じて実行されます。

型の自動変換

修飾子がデータの型変換のみを実行する場合は、修飾子を定義する必要はなく、フィールドの型を直接定義するだけです。

public function setScoreAttr($value, $data)
{
    return (float) $score;
}

上記の修飾子メソッドは、

protected $type = [
    'score'    =>    'float',
];

に直接変更できます。修飾子とフィールドの型を同時に定義した場合、修飾子が優先されます。

型定義は単純なデータ型を定義するだけでなく、追加の用途もあります。たとえば、json 型、配列型、オブジェクト型は JSON シリアル化され、シリアル化型はデータをシリアル化します。

PHP 中国語 Web サイトには、無料の

ThinkPHP 入門チュートリアル

が多数あり、誰でも学習することができます。 この記事は https://blog.thinkphp.cn/817548

から転載しています。

以上がThinkPHP: モデル用の 3 つの強力なツールのうちの 2 番目 (修飾子)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は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アプリで効率的な依存関係管理のための怠zyなロード、コンテキストバインディング、メソッドインジェクションなどの高度な機能を提供します。

リアルタイムのコラボレーションツールを構築するために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を使用して分散タスクキューシステムの構築を概説し、インストール、構成、タスク管理、およびスケーラビリティに焦点を当てています。重要な問題には、Immedのような一般的な落とし穴を避けるための高可用性の確保が含まれます

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ヘンタイを無料で生成します。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい