1 フォロワー

コンポーネント

コンポーネントはYiiアプリケーションの主要な構成要素です。コンポーネントはyii\base\Component、またはその拡張クラスのインスタンスです。コンポーネントが他のクラスに提供する3つの主な機能は、

これらの機能は、別々に、または組み合わせて使用することで、Yiiクラスをはるかにカスタマイズしやすく、使いやすくします。例えば、含まれているyii\jui\DatePicker(ユーザーインターフェースコンポーネント)は、ビューで使用して、インタラクティブな日付ピッカーを生成できます。

use yii\jui\DatePicker;

echo DatePicker::widget([
    'language' => 'ru',
    'name'  => 'country',
    'clientOptions' => [
        'dateFormat' => 'yy-mm-dd',
    ],
]);

ウィジェットのプロパティは、クラスがyii\base\Componentを拡張しているため、簡単に書き込むことができます。

コンポーネントは非常に強力ですが、特にイベントビヘイビアの機能をサポートするために、追加のメモリとCPU時間が必要になるため、通常のオブジェクトよりも少し重くなります。コンポーネントでこれらの2つの機能が必要ない場合は、yii\base\Componentではなくyii\base\BaseObjectからコンポーネントクラスを拡張することを検討してください。そうすることで、コンポーネントは通常のPHPオブジェクトと同じくらい効率的になりますが、プロパティのサポートが追加されます。

yii\base\Componentまたはyii\base\BaseObjectからクラスを拡張する場合は、次の規則に従うことをお勧めします。

  • コンストラクタをオーバーライドする場合は、コンストラクタの最後のパラメータとして`$config`パラメータを指定し、このパラメータを親コンストラクタに渡します。
  • オーバーライドしたコンストラクタの最後に、常に親コンストラクタを呼び出してください。
  • yii\base\BaseObject::init() メソッドをオーバーライドする場合は、必ずinit()メソッドの先頭で親実装のinit()を呼び出してください。

例:

<?php

namespace yii\components\MyClass;

use yii\base\BaseObject;

class MyClass extends BaseObject
{
    public $prop1;
    public $prop2;

    public function __construct($param1, $param2, $config = [])
    {
        // ... initialization before configuration is applied

        parent::__construct($config);
    }

    public function init()
    {
        parent::init();

        // ... initialization after configuration is applied
    }
}

これらのガイドラインに従うことで、コンポーネントの作成時に設定可能になります。例:

$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// alternatively
$component = \Yii::createObject([
    'class' => MyClass::class,
    'prop1' => 3,
    'prop2' => 4,
], [1, 2]);

情報: Yii::createObject() を呼び出す方法はより複雑に見えますが、依存性注入コンテナの上に実装されているため、より強力です。

yii\base\BaseObject クラスは、次のオブジェクトライフサイクルを強制します。

  1. コンストラクタ内での初期化前処理。ここでデフォルトのプロパティ値を設定できます。
  2. $configによるオブジェクト設定。設定によって、コンストラクタで設定されたデフォルト値を上書きできます。
  3. init()内での初期化後処理。このメソッドをオーバーライドして、プロパティの整合性チェックと正規化を実行できます。
  4. オブジェクトメソッド呼び出し。

最初の3つのステップはすべてオブジェクトのコンストラクタ内で発生します。つまり、クラスインスタンス(つまりオブジェクト)を取得すると、そのオブジェクトはすでに適切で信頼できる状態に初期化されています。

タイプミスを見つけたり、このページの改善が必要だと思われる場合は、
Githubで編集してください !