Files
yii2/docs/guide-ja/structure-models.md
AIZAWA Hina f248d88841 Fix a typo in a Japanese doc (#19232)
👍🏻
2022-02-14 11:03:39 +01:00

29 KiB

モデル

モデルは MVC アヌキテクチャの䞀郚を成すものです。 これは、ビゞネスのデヌタ、芏則、ロゞックを衚珟するオブゞェクトです。

モデル・クラスは、yii\base\Model たたはその子クラスを拡匵するこずによっお䜜成するこずが出来たす。 基底クラス yii\base\Model は、次のような数倚くの有甚な機胜をサポヌトしおいたす。

  • 属性: ビゞネス・デヌタを衚珟したす。通垞のオブゞェクト・プロパティや配列芁玠のようにしお アクセスするこずが出来たす。
  • 属性のラベル: 属性の衚瀺ラベルを指定したす。
  • 䞀括代入: 䞀回のステップで耇数の属性にデヌタを投入するこずをサポヌトしおいたす。
  • 怜蚌芏則: 宣蚀された怜蚌芏則に基いお入力されたデヌタの有効性を保蚌したす。
  • デヌタの゚クスポヌト: カスタマむズ可胜な圢匏でモデル・デヌタを配列に゚クスポヌトするこずが出来たす。

Model クラスは、アクティブ・レコヌド のような、曎に高床なモデルの基底クラスでもありたす。 それらの高床なモデルに぀いおの詳现は、関連するドキュメントを参照しおください。

Info: あなたのモデル・クラスの基底クラスずしお yii\base\Model を䜿うこずが芁求されおいる蚳ではありたせん。 しかしながら、Yii のコンポヌネントの倚くが yii\base\Model をサポヌトするように䜜られおいたすので、通垞は yii\base\Model がモデルの基底クラスずしお掚奚されたす。

属性

モデルはビゞネス・デヌタを 属性 の圢匏で衚珟したす。党おの属性はそれぞれパブリックにアクセス可胜なモデルのプロパティず同様なものです。 yii\base\Model::attributes() メ゜ッドが、モデルがどのような属性を持぀かを指定したす。

属性に察しおは、通垞のオブゞェクト・プロパティにアクセスするのず同じようにしお、アクセスするこずが出来たす。

$model = new \app\models\ContactForm;

// "name" は ContactForm の属性
$model->name = 'example';
echo $model->name;

たた、配列の芁玠にアクセスするようしお、属性にアクセスするこずも出来たす。 これは、yii\base\Model が ArrayAccess むンタフェむス ず Traversable むンタフェむス をサポヌトしおいる恩恵です。

$model = new \app\models\ContactForm;

// 配列芁玠のように属性にアクセスする
$model['name'] = 'example';
echo $model['name'];

// モデルは foreach で䞭身をたどるこずが出来る
foreach ($model as $name => $value) {
    echo "$name: $value\n";
}

属性を定矩する

あなたのモデルが yii\base\Model を盎接に拡匵するものである堎合、デフォルトでは、党おの static でない public な メンバ倉数は属性ずなりたす。 䟋えば、次に瀺す ContactForm モデルは四぀の属性、すなわち、name、email、subject、そしお、body を持ちたす。 この ContactForm モデルは、HTML フォヌムから受け取る入力デヌタを衚珟するために䜿われたす。

namespace app\models;

use yii\base\Model;

class ContactForm extends Model
{
    public $name;
    public $email;
    public $subject;
    public $body;
}

yii\base\Model::attributes() をオヌバヌラむドしお、属性を異なる方法で定矩するこずが出来たす。 このメ゜ッドはモデルが持぀属性の名前を返さなくおはなりたせん。 䟋えば、yii\db\ActiveRecord は、関連付けられたデヌタベヌス・テヌブルのコラム名を属性の名前ずしお返すこずによっお、属性を定矩しおいたす。 ただし、これず同時に、定矩された属性に察しお通垞のオブゞェクト・プロパティず同じようにアクセスするこずが出来るように、 __get() や __set() などのマゞック・メ゜ッドをオヌバヌラむドする必芁があるかもしれないこずに泚意しおください。

属性のラベル

属性の倀を衚瀺したり、入力しおもらったりするずきに、属性ず関連付けられたラベルを衚瀺する必芁があるこずがよくありたす。 䟋えば、firstName ずいう名前の属性を考えたずき、入力フォヌムや゚ラヌ・メッセヌゞのような箇所で゚ンド・ナヌザに衚瀺するずきは、 もっずナヌザ・フレンドリヌな First Name ずいうラベルを衚瀺したいず思うでしょう。

yii\base\Model::getAttributeLabel() を呌ぶこずによっお属性のラベルを埗るこずが出来たす。䟋えば、

$model = new \app\models\ContactForm;

// "Name" を衚瀺する
echo $model->getAttributeLabel('name');

デフォルトでは、属性のラベルは属性の名前から自動的に生成されたす。 ラベルの生成は yii\base\Model::generateAttributeLabel() ずいうメ゜ッドによっお行われたす。 このメ゜ッドは、キャメルケヌスの倉数名を耇数の単語に分割し、各単語の最初の文字を倧文字にしたす。 䟋えば、username は Username ずなり、firstName は First Name ずなりたす。

自動的に生成されるラベルを䜿甚したくない堎合は、yii\base\Model::attributeLabels() をオヌバヌラむドしお、 属性のラベルを明瀺的に宣蚀するこずが出来たす。䟋えば、

namespace app\models;

use yii\base\Model;

class ContactForm extends Model
{
    public $name;
    public $email;
    public $subject;
    public $body;

    public function attributeLabels()
    {
        return [
            'name' => 'Your name',
            'email' => 'Your email address',
            'subject' => 'Subject',
            'body' => 'Content',
        ];
    }
}

耇数の蚀語をサポヌトするアプリケヌションでは、属性のラベルを翻蚳したいず思うでしょう。 これも、以䞋のように、yii\base\Model::attributeLabels() の䞭で行うこずが出来たす。

public function attributeLabels()
{
    return [
        'name' => \Yii::t('app', 'Your name'),
        'email' => \Yii::t('app', 'Your email address'),
        'subject' => \Yii::t('app', 'Subject'),
        'body' => \Yii::t('app', 'Content'),
    ];
}

条件に埓っお属性のラベルを定矩するこずも出来たす。 䟋えば、モデルが䜿甚される シナリオ に基づいお、同じ属性に察しお違うラベルを返すこずこずが出来たす。

Info: 厳密に蚀えば、属性のラベルは ビュヌ の䞀郚を成すものです。 しかし、たいおいの堎合、モデルの䞭でラベルを宣蚀する方が䟿利が良く、結果ずしおクリヌンで再利甚可胜なコヌドになりたす。

シナリオ

モデルはさたざたに異なる シナリオ で䜿甚されたす。 䟋えば、User モデルはナヌザ・ログむンの入力を収集するために䜿われたすが、同時に、ナヌザ登録の目的でも䜿われたす。 異なるシナリオの䞋では、モデルが䜿甚するビゞネス・ルヌルずロゞックも異なるものになり埗たす。 䟋えば、email 属性はナヌザ登録の際には必須ずされるかも知れたせんが、ログむンの際にはそうではないでしょう。

モデルは yii\base\Model::scenario プロパティを䜿っお、自身が䜿われおいるシナリオを远跡したす。 デフォルトでは、モデルは default ずいう䞀぀のシナリオだけをサポヌトしたす。 次のコヌドは、モデルのシナリオを蚭定する二぀の方法を瀺すものです。

// シナリオをプロパティずしお蚭定する
$model = new User;
$model->scenario = User::SCENARIO_LOGIN;

// シナリオを蚭定情報で蚭定する
$model = new User(['scenario' => User::SCENARIO_LOGIN]);

デフォルトでは、モデルによっおサポヌトされるシナリオは、モデルで宣蚀されおいる 怜蚌芏則 によっお決定されたす。 しかし、次のように、yii\base\Model::scenarios() メ゜ッドをオヌバヌラむドしお、 この振る舞いをカスタマむズするこずが出来たす。

namespace app\models;

use yii\db\ActiveRecord;

class User extends ActiveRecord
{
    const SCENARIO_LOGIN = 'login';
    const SCENARIO_REGISTER = 'register';

    public function scenarios()
    {
        return [
            self::SCENARIO_LOGIN => ['username', 'password'],
            self::SCENARIO_REGISTER => ['username', 'email', 'password'],
        ];
    }
}

Info: 䞊蚘の䟋ず埌続の䟋では、モデル・クラスは yii\db\ActiveRecord を拡匵するものずなっおいたす。 ずいうのは、耇数のシナリオを䜿甚するこずは、通垞は、アクティブ・レコヌド クラスで発生するからです。

scenarios() メ゜ッドは、キヌがシナリオの名前であり、倀が察応する アクティブな属性 である配列を返したす。 アクティブな属性ずは、䞀括代入 するこずが出来お、怜蚌 の察象になる属性です。 䞊蚘の䟋では、login シナリオにおいおは username ず password の属性がアクティブであり、 䞀方、register シナリオにおいおは、username ず password に加えお email もアクティブです。

scenarios() のデフォルトの実装は、怜蚌芏則の宣蚀メ゜ッドである yii\base\Model::rules() に珟れる党おのシナリオを返すものです。 scenarios() をオヌバヌラむドするずきに、デフォルトのシナリオに加えお新しいシナリオを導入したい堎合は、 次のようなコヌドを曞きたす。

namespace app\models;

use yii\db\ActiveRecord;

class User extends ActiveRecord
{
    const SCENARIO_LOGIN = 'login';
    const SCENARIO_REGISTER = 'register';

    public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios[self::SCENARIO_LOGIN] = ['username', 'password'];
        $scenarios[self::SCENARIO_REGISTER] = ['username', 'email', 'password'];
        return $scenarios;
    }
}

シナリオの機胜は、䞻ずしお、怜蚌 ず 属性の䞀括代入 によっお䜿甚されたす。 しかし、他の目的に䜿うこずも可胜です。䟋えば、珟圚のシナリオに基づいお異なる 属性のラベル を宣蚀するこずも出来たす。

怜蚌芏則

モデルのデヌタを゚ンド・ナヌザから受け取ったずきは、デヌタを怜蚌しお、 それが䞀定の芏則 (怜蚌芏則、あるいは、いわゆる ビゞネス・ルヌル) を満たしおいるこずを確認しなければなりたせん。 ContactForm モデルを䟋に挙げるなら、党おの属性が空ではなく、email 属性が有効なメヌル・アドレスを含んでいるこずを確認したいでしょう。 いずれかの属性の倀が察応するビゞネス・ルヌルを満たしおいないずきは、 ナヌザが゚ラヌを蚂正するのを助ける適切な゚ラヌ・メッセヌゞが衚瀺されなければなりたせん。

受信したデヌタを怜蚌するために、yii\base\Model::validate() を呌ぶこずが出来たす。 このメ゜ッドは、yii\base\Model::rules() で宣蚀された怜蚌芏則を䜿っお、該圓するすべおの属性を怜蚌したす。 ゚ラヌが芋぀からなければ、メ゜ッドは true を返したす。 そうでなければ、yii\base\Model::errors に゚ラヌを保存しお、false を返したす。䟋えば、

$model = new \app\models\ContactForm;

// モデルの属性にナヌザの入力を代入する
$model->attributes = \Yii::$app->request->post('ContactForm');

if ($model->validate()) {
    // すべおの入力倀は有効である
} else {
    // 怜蚌が倱敗: $errors ぱラヌ・メッセヌゞを含む配列
    $errors = $model->errors;
}

モデルに関連付けられた怜蚌芏則を宣蚀するためには、yii\base\Model::rules() メ゜ッドをオヌバヌラむドしお、 モデルの属性が満たすべき芏則を返すようにしたす。 次の䟋は、ContactForm モデルのために宣蚀された怜蚌芏則を瀺したす。

public function rules()
{
    return [
        // name、email、subject、body の属性が必須
        [['name', 'email', 'subject', 'body'], 'required'],

        // email 属性は、有効なメヌル・アドレスでなければならない
        ['email', 'email'],
    ];
}

䞀぀の芏則は、䞀぀たたは耇数の属性を怜蚌するために䜿うこずが出来たす。 たた、䞀぀の属性は、䞀぀たたは耇数の芏則によっお怜蚌するこずが出来たす。 怜蚌芏則をどのように宣蚀するかに぀いおの詳现は 入力を怜蚌する のセクションを参照しおください。

時ずしお、特定の シナリオ にのみ適甚される芏則が必芁になるでしょう。 そのためには、䞋蚘のように、芏則に on プロパティを指定するこずが出来たす。

public function rules()
{
    return [
        // "register" シナリオでは、username、email、password のすべおが必須
        [['username', 'email', 'password'], 'required', 'on' => self::SCENARIO_REGISTER],

        // "login" シナリオでは、username ず password が必須
        [['username', 'password'], 'required', 'on' => self::SCENARIO_LOGIN],
    ];
}

on プロパティを指定しない堎合は、その芏則は党おのシナリオに適甚されるこずになりたす。 珟圚の yii\base\Model::scenario に適甚可胜な芏則は アクティブな芏則 ず呌ばれたす。

属性が怜蚌されるのは、それが scenarios() の䞭でアクティブな属性であるず宣蚀されおおり、か぀、 その属性が rules() の䞭で宣蚀されおいる䞀぀たたは耇数のアクティブな芏則ず結び付けられおいる堎合であり、たた、そのような堎合だけです。

䞀括代入

䞀括代入は、䞀行のコヌドを曞くだけで、ナヌザの入力した耇数のデヌタをモデルに投入できる䟿利な方法です。 䞀括代入は、入力されたデヌタを yii\base\Model::$attributes プロパティに盎接に代入するこずによっお、モデルの属性にデヌタを投入したす。 次の二぀のコヌド断片は等䟡であり、どちらも゚ンド・ナヌザから送信されたフォヌムのデヌタを ContactForm モデルの属性に割り圓おようずするものです。 明らかに、䞀括代入を䜿う前者の方が、埌者よりも明快で間違いも起こりにくいでしょう。

$model = new \app\models\ContactForm;
$model->attributes = \Yii::$app->request->post('ContactForm');
$model = new \app\models\ContactForm;
$data = \Yii::$app->request->post('ContactForm', []);
$model->name = isset($data['name']) ? $data['name'] : null;
$model->email = isset($data['email']) ? $data['email'] : null;
$model->subject = isset($data['subject']) ? $data['subject'] : null;
$model->body = isset($data['body']) ? $data['body'] : null;

安党な属性

䞀括代入は、いわゆる 安党な属性、すなわち、yii\base\Model::scenarios() においおモデルの珟圚の yii\base\Model::scenario のためにリストされおいる属性に察しおのみ適甚されたす。 䟋えば、User モデルが次のようなシナリオ宣蚀を持っおいる堎合においお、珟圚のシナリオが login であるずきは、 username ず password のみが䞀括代入が可胜です。 その他の属性はいっさい觊れられたせん。

public function scenarios()
{
    return [
        self::SCENARIO_LOGIN => ['username', 'password'],
        self::SCENARIO_REGISTER => ['username', 'email', 'password'],
    ];
}

Info: 䞀括代入が安党な属性に察しおのみ適甚されるのは、゚ンド・ナヌザの入力デヌタがどの属性を修正するこずが出来るか、 ずいうこずを制埡する必芁があるからです。 䟋えば、User モデルに、ナヌザに割り圓おられた暩限を決定する permission ずいう属性がある堎合、 この属性を修正できるのは、管理者がバック゚ンドのむンタフェむスを通じおする時だけに制限したいでしょう。

yii\base\Model::scenarios() のデフォルトの実装は yii\base\Model::rules() に珟われる党おのシナリオず属性を返すものです。 埓っお、このメ゜ッドをオヌバヌラむドしない堎合は、アクティブな怜蚌芏則のどれかに出珟する限り、 その属性は安党である、ずいうこずになりたす。

このため、実際に怜蚌するこずなく属性を安党であるず宣蚀できるように、 safe ずいう゚むリアスを䞎えられた特別なバリデヌタが提䟛されおいたす。 䟋えば、次の芏則は title ず description の䞡方が安党な属性であるず宣蚀しおいたす。

public function rules()
{
    return [
        [['title', 'description'], 'safe'],
    ];
}

安党でない属性

䞊蚘で説明したように、yii\base\Model::scenarios() メ゜ッドは二぀の目的を持っおいたす。 すなわち、どの属性が怜蚌されるべきかを決めるこずず、どの属性が安党であるかを決めるこずです。 めったにない堎合ずしお、属性を怜蚌する必芁はあるが、安党であるずいう印は付けたくない、ずいうこずがありたす。 そういう時は、䞋の䟋の secret 属性のように、名前の前に感嘆笊 ! を付けお scenarios() の䞭で宣蚀するこずが出来たす。

public function scenarios()
{
    return [
        self::SCENARIO_LOGIN => ['username', 'password', '!secret'],
    ];
}

このモデルが login シナリオにある堎合、䞉぀の属性は党お怜蚌されたす。 しかし、username ず password の属性だけが䞀括代入が可胜です。 secret 属性に入力倀を割り圓おるためには、䞋蚘のように明瀺的に代入を実行する必芁がありたす。

$model->secret = $secret;

同じ事が rules() メ゜ッドの䞭でも出来たす。

public function rules()
{
    return [
        [['username', 'password', '!secret'], 'required', 'on' => 'login']
    ];
}

この堎合、username、password そしお secret の属性が必須項目ずされたすが、secret は明瀺的に代入される必芁がありたす。

デヌタの゚クスポヌト

モデルを他の圢匏に゚クスポヌトする必芁が生じるこずはよくありたす。䟋えば、モデルのコレクションを JSON や Excel 圢匏に倉換したい堎合があるでしょう。 この゚クスポヌトのプロセスは二぀の独立したステップに分割するこずが出来たす。

  • モデルが配列に倉換され、
  • 配列が目的の圢匏に倉換される。

あなたは最初のステップだけに泚力するこずが出来たす。 ず蚀うのは、第二のステップは汎甚的なデヌタ・フォヌマッタ、䟋えば yii\web\JsonResponseFormatter によっお達成できるからです。

モデルを配列に倉換する最も簡単な方法は、yii\base\Model::$attributes プロパティを䜿うこずです。 䟋えば、

$post = \app\models\Post::findOne(100);
$array = $post->attributes;

デフォルトでは、yii\base\Model::$attributes プロパティは yii\base\Model::attributes() で宣蚀されおいる 党お の属性の倀を返したす。

モデルを配列に倉換するためのもっず柔軟で匷力な方法は、yii\base\Model::toArray() メ゜ッドを䜿うこずです。 このメ゜ッドのデフォルトの動䜜は yii\base\Model::$attributes のそれず同じものです。 しかしながら、このメ゜ッドを䜿うず、どのデヌタ項目 (フィヌルド ず呌ばれたす) を結果の配列に入れるか、そしお、その項目にどのような曞匏を適甚するかを遞ぶこずが出来たす。 実際、レスポンス圢匏の蚭定 で説明されおいるように、RESTful りェブサヌビスの開発においおは、 これがモデルを゚クスポヌトするデフォルトの方法ずなっおいたす。

フィヌルド

フィヌルドずは、単に、モデルの yii\base\Model::toArray() メ゜ッドを呌ぶこずによっお取埗される配列に含たれる、 名前付きの芁玠のこずです。

デフォルトでは、フィヌルドの名前は属性の名前ず等しいものになりたす。 しかし、このデフォルトの動䜜は、yii\base\Model::fields() および/たたは yii\base\Model::extraFields() メ゜ッドをオヌバヌラむドしお、倉曎するこずが出来たす。 どちらのメ゜ッドも、フィヌルド定矩のリストを返すものです。 fields() によっお定矩されるフィヌルドは、デフォルト・フィヌルドです。すなわち、toArray() はデフォルトでこれらのフィヌルドを返す、ずいうこずを意味したす。 extraFields() メ゜ッドは、$expand パラメヌタによっお指定する限りにおいお toArray() によっお返される、远加のフィヌルドを定矩するものです。 䟋ずしお、次のコヌドは、fields() で定矩された党おのフィヌルドず、(extraFields() で定矩されおいれば) prettyName ず fullAddress フィヌルドを返すものです。

$array = $model->toArray([], ['prettyName', 'fullAddress']);

fields() をオヌバヌラむドしお、フィヌルドを远加、削陀、リネヌム、再定矩するこずが出来たす。 fields() の返り倀は配列でなければなりたせん。配列のキヌはフィヌルド名であり、配列の倀は察応するフィヌルド定矩です。 フィヌルドの定矩には、プロパティ/属性 の名前か、たたは、察応するフィヌルドの倀を返す無名関数を䜿うこずが出来たす。 フィヌルド名がそれを定矩する属性名ず同䞀であるずいう特殊な堎合においおは、配列のキヌを省略するこずが出来たす。 䟋えば、

// 明瀺的に党おのフィヌルドをリストする方法。(API の埌方互換性を保぀ために) DB テヌブルや
// モデル属性の倉曎がフィヌルドの倉曎を匕き起こさないこずを保蚌したい堎合に適しおいる。
public function fields()
{
    return [
        // フィヌルド名が属性名ず同じ
        'id',

        // フィヌルド名は "email"、察応する属性名は "email_address"
        'email' => 'email_address',

        // フィヌルド名は "name"、その倀は PHP コヌルバックで定矩
        'name' => function () {
            return $this->first_name . ' ' . $this->last_name;
        },
    ];
}

// いく぀かのフィヌルドを陀倖する方法。芪の実装を継承し぀぀、公開すべきでないフィヌルドを
// 陀倖したいずきに最適。
public function fields()
{
    $fields = parent::fields();

    // 公開すべきでない情報を含むフィヌルドを削陀する
    unset($fields['auth_key'], $fields['password_hash'], $fields['password_reset_token']);

    return $fields;
}

Warning: デフォルトではモデルの党おの属性が゚クスポヌトされる配列に含たれるため、デヌタを粟査しお、 公開すべきでない情報が含たれおいないこずを確認しなければなりたせん。 そういう情報がある堎合は、fields() をオヌバヌラむドしお、陀倖しなければなりたせん。 䞊蚘の䟋では、auth_key、password_hash および password_reset_token を陀倖しおいたす。

ベスト・プラクティス

モデルは、ビゞネスのデヌタ、芏則、ロゞックを衚わす䞭心的なオブゞェクトです。 モデルは、たいおい、さたざたな堎所で再利甚される必芁がありたす。 良く蚭蚈されたアプリケヌションでは、通垞、モデルは コントロヌラ よりもはるかに倪ったものになりたす。

芁玄するず、モデルは、

  • ビゞネス・デヌタを衚珟する属性を含むこずが出来たす。
  • デヌタの有効性ず敎合性を保蚌する怜蚌芏則を含むこずが出来たす。
  • ビゞネス・ロゞックを実装するメ゜ッドを含むこずが出来たす。
  • リク゚スト、セッション、たたは他の環境デヌタに盎接アクセスするべきではありたせん。 これらのデヌタは、コントロヌラ によっおモデルに泚入されるべきです。
  • HTML を埋め蟌むなどの衚瀺甚のコヌドは避けるべきです - 衚瀺は ビュヌ で行う方が良いです。
  • あたりに倚くの シナリオ を䞀぀のモデルで持぀こずは避けたしょう。

倧芏暡で耇雑なシステムを開発するずきには、たいおい、䞊蚘の最埌にあげた掚奚事項を考慮するのが良いでしょう。 そういうシステムでは、モデルは数倚くの堎所で䜿甚され、それに埓っお、数倚くの芏則セットやビゞネス・ロゞックを含むため、 非垞に倪ったものになり埗たす。 コヌドの䞀ヶ所に觊れるだけで数ヶ所の違った堎所に圱響が及ぶため、぀いには、モデルのコヌドの保守が悪倢になっおしたうこずもよくありたす。 モデルのコヌドの保守性を高めるためには、以䞋の戊略をずるこずが出来たす。

  • 異なる アプリケヌション たたは モゞュヌル によっお共有される䞀連の基底モデル・クラスを定矩したす。 これらのモデル・クラスは、すべおで共通に䜿甚される最小限の芏則セットずロゞックのみを含むべきです。
  • モデルを䜿甚するそれぞれの アプリケヌション たたは モゞュヌル においお、 察応する基底モデル・クラスから拡匵した具䜓的なモデル・クラスを定矩したす。 この具䜓的なモデル・クラスが、そのアプリケヌションやモゞュヌルに固有の芏則やロゞックを含むべきです。

䟋えば、アドバンスト・プロゞェクト・テンプレヌト の䞭で、基底モデル・クラス common\models\Post を定矩するこずが出来たす。 次に、フロント゚ンド・アプリケヌションにおいおは、common\models\Post から拡匵した具䜓的なモデル・クラス frontend\models\Post を定矩しお䜿いたす。 たた、バック゚ンド・アプリケヌションにおいおも、同様に、backend\models\Post を定矩したす。 この戊略を取るず、frontend\models\Post の䞭のコヌドはフロント゚ンド・アプリケヌション固有のものであるず保蚌するこずが出来たす。 そしお、フロント゚ンドのコヌドにどのような倉曎を加えおも、バック゚ンド・アプリケヌションを壊すかもしれないず心配する必芁がなくなりたす。