クラス yii\di\Container
継承 | yii\di\Container » yii\base\Component » yii\base\BaseObject |
---|---|
実装 | yii\base\Configurable |
利用可能なバージョン | 2.0 |
ソースコード | https://github.com/yiisoft/yii2/blob/master/framework/di/Container.php |
Container は 依存性注入 コンテナを実装します。
依存性注入 (DI) コンテナは、オブジェクトと、それらが依存するすべてのオブジェクトをインスタンス化および構成する方法を知っているオブジェクトです。DI について詳しくは、Martin Fowler の記事を参照してください。
Container は、コンストラクターインジェクションとプロパティインジェクションをサポートしています。
Container を使用するには、最初に set() を呼び出してクラスの依存関係を設定する必要があります。次に、get() を呼び出して新しいクラスオブジェクトを作成します。Container は、依存オブジェクトを自動的にインスタンス化し、作成中のオブジェクトに注入し、構成してから、最後に新しく作成したオブジェクトを返します。
デフォルトでは、Yii::$container は、Yii::createObject() が新しいオブジェクトインスタンスを作成するために使用する Container インスタンスを参照します。このメソッドを使用して、新しいオブジェクトを作成する際に new
演算子を置き換えることができます。これにより、自動依存関係解決とデフォルトのプロパティ構成の利点が得られます。
以下は、Container の使用例です。
namespace app\models;
use yii\base\BaseObject;
use yii\db\Connection;
use yii\di\Container;
interface UserFinderInterface
{
function findUser();
}
class UserFinder extends BaseObject implements UserFinderInterface
{
public $db;
public function __construct(Connection $db, $config = [])
{
$this->db = $db;
parent::__construct($config);
}
public function findUser()
{
}
}
class UserLister extends BaseObject
{
public $finder;
public function __construct(UserFinderInterface $finder, $config = [])
{
$this->finder = $finder;
parent::__construct($config);
}
}
$container = new Container;
$container->set('yii\db\Connection', [
'dsn' => '...',
]);
$container->set('app\models\UserFinderInterface', [
'class' => 'app\models\UserFinder',
]);
$container->set('userLister', 'app\models\UserLister');
$lister = $container->get('userLister');
// which is equivalent to:
$db = new \yii\db\Connection(['dsn' => '...']);
$finder = new UserFinder($db);
$lister = new UserLister($finder);
Container の詳細および使用情報については、di-containers に関するガイド記事をご覧ください。
パブリックプロパティ
プロパティ | タイプ | 説明 | 定義元 |
---|---|---|---|
$behaviors | yii\base\Behavior[] | このコンポーネントにアタッチされたビヘイビアのリスト。 | yii\base\Component |
$definitions | 配列 | オブジェクト定義またはロードされた共有オブジェクト (タイプまたは ID => 定義またはインスタンス) のリスト。 | yii\di\Container |
$resolveArrays | ブール値 | 配列の依存関係で要素の解決を試みるかどうか。 | yii\di\Container |
$singleton | 文字列 | クラス名、インターフェース名、またはエイリアス名 | yii\di\Container |
$singletons | 配列 | シングルトン定義の配列。 | yii\di\Container |
パブリックメソッド
保護されたメソッド
メソッド | 説明 | 定義元 |
---|---|---|
build() | 指定されたクラスのインスタンスを作成します。 | yii\di\Container |
getDependencies() | 指定されたクラスの依存関係を返します。 | yii\di\Container |
mergeParams() | ユーザー指定のコンストラクターパラメーターを、set() を介して登録されたパラメーターとマージします。 | yii\di\Container |
normalizeDefinition() | クラス定義を正規化します。 | yii\di\Container |
resolveDependencies() | 依存関係を実際のオブジェクトインスタンスに置き換えることで解決します。 | yii\di\Container |
プロパティの詳細
オブジェクト定義またはロードされた共有オブジェクト (タイプまたは ID => 定義またはインスタンス) のリスト。
クラス名、インターフェース名、またはエイリアス名
シングルトン定義の配列。配列の許容形式についてはsetDefinitions()を参照してください。
メソッド詳細
定義元: yii\base\Component::__call()
クラスメソッドではない名前付きメソッドを呼び出します。
このメソッドは、付随するビヘイビアが指定された名前のメソッドを持っているかどうかを確認し、もしあれば実行します。
不明なメソッドが呼び出されたときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。
public mixed __call ( $name, $params ) | ||
$name | 文字列 |
メソッド名 |
$params | 配列 |
メソッドのパラメータ |
return | mixed |
メソッドの戻り値 |
---|---|---|
throws | yii\base\UnknownMethodException |
不明なメソッドを呼び出した場合 |
public function __call($name, $params)
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $object) {
if ($object->hasMethod($name)) {
return call_user_func_array([$object, $name], $params);
}
}
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
定義元: yii\base\Component::__clone()
このメソッドは、既存のオブジェクトを複製してオブジェクトが作成された後に呼び出されます。
古いオブジェクトにアタッチされているため、すべてのビヘイビアを削除します。
public void __clone ( ) |
public function __clone()
{
$this->_events = [];
$this->_eventWildcards = [];
$this->_behaviors = null;
}
定義元: yii\base\BaseObject::__construct()
コンストラクタ。
デフォルトの実装では次の2つの処理を行います。
- 与えられた設定
$config
でオブジェクトを初期化します。 - init()を呼び出します。
このメソッドが子クラスでオーバーライドされている場合、推奨されるのは
- コンストラクタの最後のパラメータが、ここでの
$config
のような設定配列であることです。 - コンストラクタの最後に親の実装を呼び出すことです。
public void __construct ( $config = [] ) | ||
$config | 配列 |
オブジェクトのプロパティを初期化するために使用される名前と値のペア |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定義元: yii\base\Component::__get()
コンポーネントプロパティの値を返します。
このメソッドは以下の順序で確認し、それに応じて動作します。
- ゲッターによって定義されたプロパティ:ゲッターの結果を返します。
- ビヘイビアのプロパティ:ビヘイビアのプロパティ値を返します。
$value = $component->property;
の実行時に暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。
また、__set()も参照してください。
public mixed __get ( $name ) | ||
$name | 文字列 |
プロパティ名 |
return | mixed |
プロパティの値またはビヘイビアのプロパティの値 |
---|---|---|
throws | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
throws | yii\base\InvalidCallException |
プロパティが書き込み専用の場合。 |
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
// read property, e.g. getName()
return $this->$getter();
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name;
}
}
if (method_exists($this, 'set' . $name)) {
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
定義元: yii\base\Component::__isset()
プロパティが設定されているか、つまり定義されており、null でないかを確認します。
このメソッドは以下の順序で確認し、それに応じて動作します。
- セッターによって定義されたプロパティ:プロパティが設定されているかどうかを返します。
- ビヘイビアのプロパティ:プロパティが設定されているかどうかを返します。
- 存在しないプロパティの場合は
false
を返します。
isset($component->property)
を実行したときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。
また、https://www.php.net/manual/en/function.isset.phpも参照してください。
public boolean __isset ( $name ) | ||
$name | 文字列 |
プロパティ名またはイベント名 |
return | ブール値 |
指定されたプロパティが設定されているかどうか |
---|
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name !== null;
}
}
return false;
}
定義元: yii\base\Component::__set()
コンポーネントプロパティの値を設定します。
このメソッドは以下の順序で確認し、それに応じて動作します。
- セッターによって定義されたプロパティ:プロパティ値を設定します。
- 「on xyz」の形式のイベント:「xyz」イベントにハンドラをアタッチします。
- 「as xyz」の形式のビヘイビア:「xyz」という名前のビヘイビアをアタッチします。
- ビヘイビアのプロパティ:ビヘイビアのプロパティ値を設定します。
$component->property = $value;
を実行したときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。
また、__get()も参照してください。
public void __set ( $name, $value ) | ||
$name | 文字列 |
プロパティ名またはイベント名 |
$value | mixed |
プロパティの値 |
throws | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
---|---|---|
throws | yii\base\InvalidCallException |
プロパティが読み取り専用の場合。 |
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
// set property
$this->$setter($value);
return;
} elseif (strncmp($name, 'on ', 3) === 0) {
// on event: attach event handler
$this->on(trim(substr($name, 3)), $value);
return;
} elseif (strncmp($name, 'as ', 3) === 0) {
// as behavior: attach behavior
$name = trim(substr($name, 3));
$this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = $value;
return;
}
}
if (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
定義元: yii\base\Component::__unset()
コンポーネントプロパティを null に設定します。
このメソッドは以下の順序で確認し、それに応じて動作します。
- セッターによって定義されたプロパティ:プロパティ値をnullに設定します。
- ビヘイビアのプロパティ:プロパティ値をnullに設定します。
unset($component->property)
を実行したときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。
また、https://www.php.net/manual/en/function.unset.phpも参照してください。
public void __unset ( $name ) | ||
$name | 文字列 |
プロパティ名 |
throws | yii\base\InvalidCallException |
プロパティが読み取り専用の場合。 |
---|
public function __unset($name)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter(null);
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = null;
return;
}
}
throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);
}
定義場所: yii\base\Component::attachBehavior()
このコンポーネントにビヘイビアをアタッチします。
このメソッドは、与えられた設定に基づいてビヘイビアオブジェクトを作成します。その後、yii\base\Behavior::attach()メソッドを呼び出すことで、ビヘイビアオブジェクトがこのコンポーネントにアタッチされます。
detachBehavior() も参照してください。
public yii\base\Behavior attachBehavior ( $name, $behavior ) | ||
$name | 文字列 |
ビヘイビアの名前。 |
$behavior | string|array|yii\base\Behavior |
ビヘイビアの設定。次のいずれかになります。
|
return | yii\base\Behavior |
ビヘイビアオブジェクト |
---|
public function attachBehavior($name, $behavior)
{
$this->ensureBehaviors();
return $this->attachBehaviorInternal($name, $behavior);
}
定義場所: yii\base\Component::attachBehaviors()
コンポーネントにビヘイビアのリストをアタッチします。
各ビヘイビアはその名前でインデックスされ、yii\base\Behaviorオブジェクト、ビヘイビアクラスを指定する文字列、またはビヘイビアを作成するための設定配列である必要があります。
attachBehavior()も参照してください。
public void attachBehaviors ( $behaviors ) | ||
$behaviors | 配列 |
コンポーネントにアタッチされるビヘイビアのリスト |
public function attachBehaviors($behaviors)
{
$this->ensureBehaviors();
foreach ($behaviors as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
定義場所: yii\base\Component::behaviors()
このコンポーネントが動作するべきビヘイビアのリストを返します。
子クラスは、このメソッドをオーバーライドして、それらがビヘイビアとして振る舞うようにしたいビヘイビアを指定できます。
このメソッドの戻り値は、ビヘイビア名でインデックスされたビヘイビアオブジェクトまたは設定の配列である必要があります。ビヘイビアの設定は、ビヘイビアクラスを指定する文字列か、次の構造の配列のいずれかになります。
'behaviorName' => [
'class' => 'BehaviorClass',
'property1' => 'value1',
'property2' => 'value2',
]
ビヘイビアクラスはyii\base\Behaviorを拡張する必要があることに注意してください。ビヘイビアは、名前付きまたは匿名でアタッチできます。名前が配列のキーとして使用されている場合、この名前を使用して、後でgetBehavior()を使用して取得するか、detachBehavior()を使用してデタッチすることができます。匿名ビヘイビアは、取得またはデタッチすることはできません。
このメソッドで宣言されたビヘイビアは、(要求に応じて)コンポーネントに自動的にアタッチされます。
public array behaviors ( ) | ||
return | 配列 |
ビヘイビア設定。 |
---|
public function behaviors()
{
return [];
}
指定されたクラスのインスタンスを作成します。
このメソッドは、指定されたクラスの依存関係を解決し、それらをインスタンス化し、指定されたクラスの新しいインスタンスにそれらを注入します。
protected object build ( $class, $params, $config ) | ||
$class | 文字列 |
クラス名 |
$params | 配列 |
コンストラクタパラメータ |
$config | 配列 |
新しいインスタンスに適用される設定 |
return | object |
指定されたクラスの新たに作成されたインスタンス |
---|---|---|
throws | yii\di\NotInstantiableException |
(2.0.9以降)抽象クラスまたはインターフェースに解決された場合 |
protected function build($class, $params, $config)
{
/* @var $reflection ReflectionClass */
list($reflection, $dependencies) = $this->getDependencies($class);
$addDependencies = [];
if (isset($config['__construct()'])) {
$addDependencies = $config['__construct()'];
unset($config['__construct()']);
}
foreach ($params as $index => $param) {
$addDependencies[$index] = $param;
}
$this->validateDependencies($addDependencies);
if ($addDependencies && is_int(key($addDependencies))) {
$dependencies = array_values($dependencies);
$dependencies = $this->mergeDependencies($dependencies, $addDependencies);
} else {
$dependencies = $this->mergeDependencies($dependencies, $addDependencies);
$dependencies = array_values($dependencies);
}
$dependencies = $this->resolveDependencies($dependencies, $reflection);
if (!$reflection->isInstantiable()) {
throw new NotInstantiableException($reflection->name);
}
if (empty($config)) {
return $reflection->newInstanceArgs($dependencies);
}
$config = $this->resolveDependencies($config);
if (!empty($dependencies) && $reflection->implementsInterface('yii\base\Configurable')) {
// set $config as the last parameter (existing one will be overwritten)
$dependencies[count($dependencies) - 1] = $config;
return $reflection->newInstanceArgs($dependencies);
}
$object = $reflection->newInstanceArgs($dependencies);
foreach ($config as $name => $value) {
$object->$name = $value;
}
return $object;
}
定義場所: yii\base\Component::canGetProperty()
プロパティを読み取れるかどうかを示す値を返します。
プロパティは、以下の場合に読み取ることができます。
- クラスに指定された名前に関連付けられたgetterメソッドがある場合 (この場合、プロパティ名は大文字と小文字を区別しません)。
- クラスに指定された名前のメンバ変数がある場合 (
$checkVars
がtrueの場合)。 - アタッチされたビヘイビアに指定された名前の読み取り可能なプロパティがある場合 (
$checkBehaviors
がtrueの場合)。
canSetProperty()も参照してください。
public boolean canGetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | 文字列 |
プロパティ名 |
$checkVars | ブール値 |
メンバ変数をプロパティとして扱うかどうか |
$checkBehaviors | ブール値 |
ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか |
return | ブール値 |
プロパティを読み取ることができるかどうか |
---|
public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
定義場所: yii\base\Component::canSetProperty()
プロパティを設定できるかどうかを示す値を返します。
プロパティは、以下の場合に書き込むことができます。
- クラスに指定された名前に関連付けられたsetterメソッドがある場合 (この場合、プロパティ名は大文字と小文字を区別しません)。
- クラスに指定された名前のメンバ変数がある場合 (
$checkVars
がtrueの場合)。 - アタッチされたビヘイビアに指定された名前の書き込み可能なプロパティがある場合 (
$checkBehaviors
がtrueの場合)。
canGetProperty()も参照してください。
public boolean canSetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | 文字列 |
プロパティ名 |
$checkVars | ブール値 |
メンバ変数をプロパティとして扱うかどうか |
$checkBehaviors | ブール値 |
ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか |
return | ブール値 |
プロパティに書き込むことができるかどうか |
---|
public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
::class
を使用してください。
定義場所: yii\base\BaseObject::className()
このクラスの完全修飾名を返します。
public static string className ( ) | ||
return | 文字列 |
このクラスの完全修飾名。 |
---|
public static function className()
{
return get_called_class();
}
指定された名前の定義を削除します。
public void clear ( $class ) | ||
$class | 文字列 |
クラス名、インターフェース名、またはエイリアス名 |
public function clear($class)
{
unset($this->_definitions[$class], $this->_singletons[$class]);
}
定義場所: yii\base\Component::detachBehavior()
コンポーネントからビヘイビアをデタッチします。
ビヘイビアのyii\base\Behavior::detach()メソッドが呼び出されます。
public yii\base\Behavior|null detachBehavior ( $name ) | ||
$name | 文字列 |
ビヘイビアの名前。 |
return | yii\base\Behavior|null |
デタッチされたビヘイビア。ビヘイビアが存在しない場合はNull。 |
---|
public function detachBehavior($name)
{
$this->ensureBehaviors();
if (isset($this->_behaviors[$name])) {
$behavior = $this->_behaviors[$name];
unset($this->_behaviors[$name]);
$behavior->detach();
return $behavior;
}
return null;
}
定義元: yii\base\Component::detachBehaviors()
コンポーネントからすべてのビヘイビアをデタッチします。
public void detachBehaviors ( ) |
public function detachBehaviors()
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $name => $behavior) {
$this->detachBehavior($name);
}
}
定義元: yii\base\Component::ensureBehaviors()
behaviors() で宣言されたビヘイビアがこのコンポーネントにアタッチされていることを確認します。
public void ensureBehaviors ( ) |
public function ensureBehaviors()
{
if ($this->_behaviors === null) {
$this->_behaviors = [];
foreach ($this->behaviors() as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
}
要求されたクラスのインスタンスを返します。
インスタンスの生成中に使用されるコンストラクタパラメータ ($params
) とオブジェクト構成 ($config
) を提供できます。
クラスが yii\base\Configurable を実装している場合、$config
パラメータはクラスのコンストラクタへの最後のパラメータとして渡されます。そうでない場合、構成はオブジェクトがインスタンス化された後に適用されます。
クラスが setSingleton() を呼び出すことによってシングルトンとして宣言されている場合、このメソッドが呼び出されるたびに、同じクラスのインスタンスが返されることに注意してください。この場合、コンストラクタパラメータとオブジェクト構成は、クラスが最初にインスタンス化された場合にのみ使用されます。
public object get ( $class, $params = [], $config = [] ) | ||
$class | string|yii\di\Instance |
クラスインスタンス、名前、または set() または setSingleton() を介して以前に登録されたエイリアス名(例: |
$params | 配列 |
コンストラクタのパラメータ値のリスト。以下の2つの定義のいずれかを使用してください。
|
$config | 配列 |
オブジェクトのプロパティを初期化するために使用される名前と値のペアのリスト。 |
return | object |
要求されたクラスのインスタンス。 |
---|---|---|
throws | yii\base\InvalidConfigException |
クラスを認識できない場合、または無効な定義に対応する場合 |
throws | yii\di\NotInstantiableException |
(2.0.9以降)抽象クラスまたはインターフェースに解決された場合 |
public function get($class, $params = [], $config = [])
{
if ($class instanceof Instance) {
$class = $class->id;
}
if (isset($this->_singletons[$class])) {
// singleton
return $this->_singletons[$class];
} elseif (!isset($this->_definitions[$class])) {
return $this->build($class, $params, $config);
}
$definition = $this->_definitions[$class];
if (is_callable($definition, true)) {
$params = $this->resolveDependencies($this->mergeParams($class, $params));
$object = call_user_func($definition, $this, $params, $config);
} elseif (is_array($definition)) {
$concrete = $definition['class'];
unset($definition['class']);
$config = array_merge($definition, $config);
$params = $this->mergeParams($class, $params);
if ($concrete === $class) {
$object = $this->build($class, $params, $config);
} else {
$object = $this->get($concrete, $params, $config);
}
} elseif (is_object($definition)) {
return $this->_singletons[$class] = $definition;
} else {
throw new InvalidConfigException('Unexpected object definition type: ' . gettype($definition));
}
if (array_key_exists($class, $this->_singletons)) {
// singleton
$this->_singletons[$class] = $object;
}
return $object;
}
定義元: yii\base\Component::getBehavior()
名前付きビヘイビアオブジェクトを返します。
public yii\base\Behavior|null getBehavior ( $name ) | ||
$name | 文字列 |
ビヘイビア名 |
return | yii\base\Behavior|null |
ビヘイビアオブジェクト。存在しない場合はnull |
---|
public function getBehavior($name)
{
$this->ensureBehaviors();
return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}
定義元: yii\base\Component::getBehaviors()
このコンポーネントにアタッチされたすべてのビヘイビアを返します。
public yii\base\Behavior[] getBehaviors ( ) | ||
return | yii\base\Behavior[] |
このコンポーネントにアタッチされたビヘイビアのリスト |
---|
public function getBehaviors()
{
$this->ensureBehaviors();
return $this->_behaviors;
}
オブジェクト定義またはロードされた共有オブジェクトのリストを返します。
public array getDefinitions ( ) | ||
return | 配列 |
オブジェクト定義またはロードされた共有オブジェクト (タイプまたは ID => 定義またはインスタンス) のリスト。 |
---|
public function getDefinitions()
{
return $this->_definitions;
}
指定されたクラスの依存関係を返します。
protected array getDependencies ( $class ) | ||
$class | 文字列 |
クラス名、インターフェース名、またはエイリアス名 |
return | 配列 |
指定されたクラスの依存関係。 |
---|---|---|
throws | yii\di\NotInstantiableException |
依存関係を解決できない場合、または依存関係を満たすことができない場合。 |
protected function getDependencies($class)
{
if (isset($this->_reflections[$class])) {
return [$this->_reflections[$class], $this->_dependencies[$class]];
}
$dependencies = [];
try {
$reflection = new ReflectionClass($class);
} catch (\ReflectionException $e) {
throw new NotInstantiableException(
$class,
'Failed to instantiate component or class "' . $class . '".',
0,
$e
);
}
$constructor = $reflection->getConstructor();
if ($constructor !== null) {
foreach ($constructor->getParameters() as $param) {
if (PHP_VERSION_ID >= 50600 && $param->isVariadic()) {
break;
}
if (PHP_VERSION_ID >= 80000) {
$c = $param->getType();
$isClass = false;
if ($c instanceof ReflectionNamedType) {
$isClass = !$c->isBuiltin();
}
} else {
try {
$c = $param->getClass();
} catch (ReflectionException $e) {
if (!$this->isNulledParam($param)) {
$notInstantiableClass = null;
if (PHP_VERSION_ID >= 70000) {
$type = $param->getType();
if ($type instanceof ReflectionNamedType) {
$notInstantiableClass = $type->getName();
}
}
throw new NotInstantiableException(
$notInstantiableClass,
$notInstantiableClass === null ? 'Can not instantiate unknown class.' : null
);
} else {
$c = null;
}
}
$isClass = $c !== null;
}
$className = $isClass ? $c->getName() : null;
if ($className !== null) {
$dependencies[$param->getName()] = Instance::of($className, $this->isNulledParam($param));
} else {
$dependencies[$param->getName()] = $param->isDefaultValueAvailable()
? $param->getDefaultValue()
: null;
}
}
}
$this->_reflections[$class] = $reflection;
$this->_dependencies[$class] = $dependencies;
return [$reflection, $dependencies];
}
コンテナに指定された名前の定義があるかどうかを示す値を返します。
set() も参照してください。
public boolean has ( $class ) | ||
$class | 文字列 |
クラス名、インターフェース名、またはエイリアス名 |
return | ブール値 |
コンテナが指定された名前の定義を持っているかどうか。 |
---|
public function has($class)
{
return isset($this->_definitions[$class]);
}
定義元: yii\base\Component::hasEventHandlers()
名前付きイベントにアタッチされたハンドラーがあるかどうかを示す値を返します。
public boolean hasEventHandlers ( $name ) | ||
$name | 文字列 |
イベント名 |
return | ブール値 |
イベントにアタッチされたハンドラがあるかどうか。 |
---|
public function hasEventHandlers($name)
{
$this->ensureBehaviors();
if (!empty($this->_events[$name])) {
return true;
}
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) {
return true;
}
}
return Event::hasHandlers($this, $name);
}
定義元: yii\base\Component::hasMethod()
メソッドが定義されているかどうかを示す値を返します。
メソッドは、以下の場合に定義されます。
- クラスに指定された名前のメソッドがある
- アタッチされたビヘイビアに、指定された名前のメソッドがある場合 (
$checkBehaviors
が true の場合)。
public boolean hasMethod ( $name, $checkBehaviors = true ) | ||
$name | 文字列 |
プロパティ名 |
$checkBehaviors | ブール値 |
ビヘイビアのメソッドをこのコンポーネントのメソッドとして扱うかどうか |
return | ブール値 |
メソッドが定義されているかどうか |
---|
public function hasMethod($name, $checkBehaviors = true)
{
if (method_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->hasMethod($name)) {
return true;
}
}
}
return false;
}
定義元: yii\base\Component::hasProperty()
このコンポーネントにプロパティが定義されているかどうかを示す値を返します。
プロパティは以下の場合に定義されます。
- クラスが、指定された名前に関連付けられたゲッターまたはセッターメソッドを持っている場合(この場合、プロパティ名は大小文字を区別しません)。
- クラスに指定された名前のメンバ変数がある場合 (
$checkVars
がtrueの場合)。 - アタッチされたビヘイビアが、指定された名前のプロパティを持っている場合(
$checkBehaviors
が true の場合)。
参考
public boolean hasProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | 文字列 |
プロパティ名 |
$checkVars | ブール値 |
メンバ変数をプロパティとして扱うかどうか |
$checkBehaviors | ブール値 |
ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか |
return | ブール値 |
プロパティが定義されているかどうか |
---|
public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}
指定された名前が登録済みのシングルトンに対応するかどうかを示す値を返します。
public boolean hasSingleton ( $class, $checkInstance = false ) | ||
$class | 文字列 |
クラス名、インターフェース名、またはエイリアス名 |
$checkInstance | ブール値 |
シングルトンがインスタンス化されているかどうかを確認するかどうか。 |
return | ブール値 |
指定された名前が登録済みのシングルトンに対応するかどうか。 |
---|
public function hasSingleton($class, $checkInstance = false)
{
return $checkInstance ? isset($this->_singletons[$class]) : array_key_exists($class, $this->_singletons);
}
public void init ( ) |
public function init()
{
}
パラメーターの依存関係を解決してコールバックを呼び出します。
このメソッドを使用すると、コールバックを呼び出して、型ヒント付きのパラメータ名をコンテナのオブジェクトとして解決できます。さらに、名前付きパラメータを使用して関数を呼び出すことができます。
たとえば、次のコールバックは、フォーマッターの依存関係を解決するためにコンテナを使用して呼び出すことができます
$formatString = function($string, \yii\i18n\Formatter $formatter) {
// ...
}
Yii::$container->invoke($formatString, ['string' => 'Hello World!']);
これにより、文字列 'Hello World!'
が最初のパラメータとして渡され、DIコンテナによって作成されたフォーマッターのインスタンスが2番目のパラメータとして、呼び出し可能オブジェクトに渡されます。
public mixed invoke ( callable $callback, $params = [] ) | ||
$callback | 呼び出し可能 |
呼び出すコールバック。 |
$params | 配列 |
関数のパラメータの配列。これは、パラメータのリスト、または名前付き関数パラメータを表す連想配列のいずれかになります。 |
return | mixed |
コールバックの戻り値。 |
---|---|---|
throws | yii\base\InvalidConfigException |
依存関係を解決できない場合、または依存関係を満たすことができない場合。 |
throws | yii\di\NotInstantiableException |
(2.0.9以降)抽象クラスまたはインターフェースに解決された場合 |
public function invoke(callable $callback, $params = [])
{
return call_user_func_array($callback, $this->resolveCallableDependencies($callback, $params));
}
ユーザー指定のコンストラクターパラメーターを、set() を介して登録されたパラメーターとマージします。
protected array mergeParams ( $class, $params ) | ||
$class | 文字列 |
クラス名、インターフェース名、またはエイリアス名 |
$params | 配列 |
コンストラクタパラメータ |
return | 配列 |
マージされたパラメータ |
---|
protected function mergeParams($class, $params)
{
if (empty($this->_params[$class])) {
return $params;
} elseif (empty($params)) {
return $this->_params[$class];
}
$ps = $this->_params[$class];
foreach ($params as $index => $value) {
$ps[$index] = $value;
}
return $ps;
}
クラス定義を正規化します。
protected array normalizeDefinition ( $class, $definition ) | ||
$class | 文字列 |
クラス名 |
$definition | string|array|callable |
クラス定義 |
return | 配列 |
正規化されたクラス定義 |
---|---|---|
throws | yii\base\InvalidConfigException |
定義が無効な場合。 |
protected function normalizeDefinition($class, $definition)
{
if (empty($definition)) {
return ['class' => $class];
} elseif (is_string($definition)) {
return ['class' => $definition];
} elseif ($definition instanceof Instance) {
return ['class' => $definition->id];
} elseif (is_callable($definition, true) || is_object($definition)) {
return $definition;
} elseif (is_array($definition)) {
if (!isset($definition['class']) && isset($definition['__class'])) {
$definition['class'] = $definition['__class'];
unset($definition['__class']);
}
if (!isset($definition['class'])) {
if (strpos($class, '\\') !== false) {
$definition['class'] = $class;
} else {
throw new InvalidConfigException('A class definition requires a "class" member.');
}
}
return $definition;
}
throw new InvalidConfigException("Unsupported definition type for \"$class\": " . gettype($definition));
}
定義元: yii\base\Component::off()
このコンポーネントから既存のイベントハンドラーをデタッチします。
このメソッドは on() の反対です。
注意: イベント名にワイルドカードパターンが渡された場合、このワイルドカードで登録されたハンドラーのみが削除され、このワイルドカードに一致するプレーン名で登録されたハンドラーは残ります。
参考 on()。
public boolean off ( $name, $handler = null ) | ||
$name | 文字列 |
イベント名 |
$handler | callable|null |
削除するイベントハンドラー。null の場合、指定されたイベントにアタッチされたすべてのハンドラーが削除されます。 |
return | ブール値 |
ハンドラーが見つかり、デタッチされた場合 |
---|
public function off($name, $handler = null)
{
$this->ensureBehaviors();
if (empty($this->_events[$name]) && empty($this->_eventWildcards[$name])) {
return false;
}
if ($handler === null) {
unset($this->_events[$name], $this->_eventWildcards[$name]);
return true;
}
$removed = false;
// plain event names
if (isset($this->_events[$name])) {
foreach ($this->_events[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_events[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_events[$name] = array_values($this->_events[$name]);
return true;
}
}
// wildcard event names
if (isset($this->_eventWildcards[$name])) {
foreach ($this->_eventWildcards[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_eventWildcards[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
// remove empty wildcards to save future redundant regex checks:
if (empty($this->_eventWildcards[$name])) {
unset($this->_eventWildcards[$name]);
}
}
}
return $removed;
}
イベントにイベントハンドラーをアタッチします。
イベントハンドラーは有効なPHPコールバックである必要があります。以下にいくつかの例を示します
function ($event) { ... } // anonymous function
[$object, 'handleClick'] // $object->handleClick()
['Page', 'handleClick'] // Page::handleClick()
'handleClick' // global function handleClick()
イベントハンドラーは、次のシグネチャで定義する必要があります。
function ($event)
ここで、$event
はイベントに関連付けられたパラメータを含む yii\base\Event オブジェクトです。
2.0.14 以降、イベント名をワイルドカードパターンとして指定できます。
$component->on('event.group.*', function ($event) {
Yii::trace($event->name . ' is triggered.');
});
参考 off()。
public void on ( $name, $handler, $data = null, $append = true ) | ||
$name | 文字列 |
イベント名 |
$handler | 呼び出し可能 |
イベントハンドラー |
$data | mixed |
イベントがトリガーされたときにイベントハンドラーに渡されるデータ。イベントハンドラーが呼び出されると、このデータは yii\base\Event::$data を介してアクセスできます。 |
$append | ブール値 |
既存のハンドラーリストの末尾に新しいイベントハンドラーを追加するかどうか。false の場合、新しいハンドラーは既存のハンドラーリストの先頭に挿入されます。 |
public function on($name, $handler, $data = null, $append = true)
{
$this->ensureBehaviors();
if (strpos($name, '*') !== false) {
if ($append || empty($this->_eventWildcards[$name])) {
$this->_eventWildcards[$name][] = [$handler, $data];
} else {
array_unshift($this->_eventWildcards[$name], [$handler, $data]);
}
return;
}
if ($append || empty($this->_events[$name])) {
$this->_events[$name][] = [$handler, $data];
} else {
array_unshift($this->_events[$name], [$handler, $data]);
}
}
関数の依存関係を解決します。
このメソッドは、invoke() によって提供されるのと同様の機能を他のコンポーネントで実装するために使用できます。
public array resolveCallableDependencies ( callable $callback, $params = [] ) | ||
$callback | 呼び出し可能 |
呼び出すコールバック。 |
$params | 配列 |
関数のパラメータの配列。数値または連想配列のいずれかになります。 |
return | 配列 |
解決された依存関係。 |
---|---|---|
throws | yii\base\InvalidConfigException |
依存関係を解決できない場合、または依存関係を満たすことができない場合。 |
throws | yii\di\NotInstantiableException |
(2.0.9以降)抽象クラスまたはインターフェースに解決された場合 |
public function resolveCallableDependencies(callable $callback, $params = [])
{
if (is_array($callback)) {
$reflection = new \ReflectionMethod($callback[0], $callback[1]);
} elseif (is_object($callback) && !$callback instanceof \Closure) {
$reflection = new \ReflectionMethod($callback, '__invoke');
} else {
$reflection = new \ReflectionFunction($callback);
}
$args = [];
$associative = ArrayHelper::isAssociative($params);
foreach ($reflection->getParameters() as $param) {
$name = $param->getName();
if (PHP_VERSION_ID >= 80000) {
$class = $param->getType();
if ($class instanceof \ReflectionUnionType || (PHP_VERSION_ID >= 80100 && $class instanceof \ReflectionIntersectionType)) {
$isClass = false;
foreach ($class->getTypes() as $type) {
if (!$type->isBuiltin()) {
$class = $type;
$isClass = true;
break;
}
}
} else {
$isClass = $class !== null && !$class->isBuiltin();
}
} else {
$class = $param->getClass();
$isClass = $class !== null;
}
if ($isClass) {
$className = $class->getName();
if (PHP_VERSION_ID >= 50600 && $param->isVariadic()) {
$args = array_merge($args, array_values($params));
break;
}
if ($associative && isset($params[$name]) && $params[$name] instanceof $className) {
$args[] = $params[$name];
unset($params[$name]);
} elseif (!$associative && isset($params[0]) && $params[0] instanceof $className) {
$args[] = array_shift($params);
} elseif (isset(Yii::$app) && Yii::$app->has($name) && ($obj = Yii::$app->get($name)) instanceof $className) {
$args[] = $obj;
} else {
// If the argument is optional we catch not instantiable exceptions
try {
$args[] = $this->get($className);
} catch (NotInstantiableException $e) {
if ($param->isDefaultValueAvailable()) {
$args[] = $param->getDefaultValue();
} else {
throw $e;
}
}
}
} elseif ($associative && isset($params[$name])) {
$args[] = $params[$name];
unset($params[$name]);
} elseif (!$associative && count($params)) {
$args[] = array_shift($params);
} elseif ($param->isDefaultValueAvailable()) {
$args[] = $param->getDefaultValue();
} elseif (!$param->isOptional()) {
$funcName = $reflection->getName();
throw new InvalidConfigException("Missing required parameter \"$name\" when calling \"$funcName\".");
}
}
foreach ($params as $value) {
$args[] = $value;
}
return $args;
}
依存関係を実際のオブジェクトインスタンスに置き換えることで解決します。
protected array resolveDependencies ( $dependencies, $reflection = null ) | ||
$dependencies | 配列 |
依存関係 |
$reflection | ReflectionClass|null |
依存関係に関連付けられたクラスリフレクション |
return | 配列 |
解決済みの依存関係 |
---|---|---|
throws | yii\base\InvalidConfigException |
依存関係を解決できない場合、または依存関係を満たすことができない場合。 |
protected function resolveDependencies($dependencies, $reflection = null)
{
foreach ($dependencies as $index => $dependency) {
if ($dependency instanceof Instance) {
if ($dependency->id !== null) {
$dependencies[$index] = $dependency->get($this);
} elseif ($reflection !== null) {
$name = $reflection->getConstructor()->getParameters()[$index]->getName();
$class = $reflection->getName();
throw new InvalidConfigException("Missing required parameter \"$name\" when instantiating \"$class\".");
}
} elseif ($this->_resolveArrays && is_array($dependency)) {
$dependencies[$index] = $this->resolveDependencies($dependency, $reflection);
}
}
return $dependencies;
}
このコンテナにクラス定義を登録します。
例:
// register a class name as is. This can be skipped.
$container->set('yii\db\Connection');
// register an interface
// When a class depends on the interface, the corresponding class
// will be instantiated as the dependent object
$container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer');
// register an alias name. You can use $container->get('foo')
// to create an instance of Connection
$container->set('foo', 'yii\db\Connection');
// register a class with configuration. The configuration
// will be applied when the class is instantiated by get()
$container->set('yii\db\Connection', [
'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
]);
// register an alias name with class configuration
// In this case, a "class" element is required to specify the class
$container->set('db', [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
]);
// register a PHP callable
// The callable will be executed when $container->get('db') is called
$container->set('db', function ($container, $params, $config) {
return new \yii\db\Connection($config);
});
もし同じ名前のクラス定義が既に存在する場合、それは新しいもので上書きされます。has() を使用して、クラス定義が既に存在するかどうかを確認できます。
public $this set ( $class, $definition = [], array $params = [] ) | ||
$class | 文字列 |
クラス名、インターフェース名、またはエイリアス名 |
$definition | mixed |
|
$params | 配列 |
コンストラクタパラメータのリスト。パラメータは、get()が呼び出されたときに、クラスコンストラクタに渡されます。 |
return | $this |
コンテナ自体 |
---|
public function set($class, $definition = [], array $params = [])
{
$this->_definitions[$class] = $this->normalizeDefinition($class, $definition);
$this->_params[$class] = $params;
unset($this->_singletons[$class]);
return $this;
}
このコンテナ内にクラス定義を登録します。
定義の可能な値の詳細については、set()も参照してください。
public void setDefinitions ( array $definitions ) | ||
$definitions | 配列 |
定義の配列。配列には2つの許可された形式があります。最初の形式は
例:
]);
2番目の形式
例:
]);
|
public function setDefinitions(array $definitions)
{
foreach ($definitions as $class => $definition) {
if (is_array($definition) && count($definition) === 2 && array_values($definition) === $definition && is_array($definition[1])) {
$this->set($class, $definition[0], $definition[1]);
continue;
}
$this->set($class, $definition);
}
}
public void setResolveArrays ( $value ) | ||
$value | ブール値 |
配列の依存関係の要素を解決しようとするかどうか |
public function setResolveArrays($value)
{
$this->_resolveArrays = (bool) $value;
}
このコンテナにクラス定義を登録し、クラスをシングルトンクラスとしてマークします。
このメソッドは、set()に似ていますが、このメソッドを介して登録されたクラスは1つのインスタンスのみを持つ点が異なります。get()が呼び出されるたびに、指定されたクラスの同じインスタンスが返されます。
set() も参照してください。
public $this setSingleton ( $class, $definition = [], array $params = [] ) | ||
$class | 文字列 |
クラス名、インターフェース名、またはエイリアス名 |
$definition | mixed |
|
$params | 配列 |
コンストラクタパラメータのリスト。パラメータは、get()が呼び出されたときに、クラスコンストラクタに渡されます。 |
return | $this |
コンテナ自体 |
---|
public function setSingleton($class, $definition = [], array $params = [])
{
$this->_definitions[$class] = $this->normalizeDefinition($class, $definition);
$this->_params[$class] = $params;
$this->_singletons[$class] = null;
return $this;
}
setSingleton() を呼び出して、このコンテナ内にクラス定義をシングルトンとして登録します。
参考
- $singletonsパラメータの許可された形式については、setDefinitions()を参照してください。
- 定義の可能な値の詳細については、setSingleton()を参照してください。
public void setSingletons ( array $singletons ) | ||
$singletons | 配列 |
シングルトン定義の配列。配列の許容形式についてはsetDefinitions()を参照してください。 |
public function setSingletons(array $singletons)
{
foreach ($singletons as $class => $definition) {
if (is_array($definition) && count($definition) === 2 && array_values($definition) === $definition) {
$this->setSingleton($class, $definition[0], $definition[1]);
continue;
}
$this->setSingleton($class, $definition);
}
}
定義元: yii\base\Component::trigger()
イベントをトリガーします。
このメソッドは、イベントの発生を表します。クラスレベルのハンドラを含む、イベントに添付されたすべてのハンドラを呼び出します。
public void trigger ( $name, yii\base\Event $event = null ) | ||
$name | 文字列 |
イベント名 |
$event | yii\base\Event|null |
イベントインスタンス。設定されていない場合、デフォルトのyii\base\Eventオブジェクトが作成されます。 |
public function trigger($name, Event $event = null)
{
$this->ensureBehaviors();
$eventHandlers = [];
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (StringHelper::matchWildcard($wildcard, $name)) {
$eventHandlers[] = $handlers;
}
}
if (!empty($this->_events[$name])) {
$eventHandlers[] = $this->_events[$name];
}
if (!empty($eventHandlers)) {
$eventHandlers = call_user_func_array('array_merge', $eventHandlers);
if ($event === null) {
$event = new Event();
}
if ($event->sender === null) {
$event->sender = $this;
}
$event->handled = false;
$event->name = $name;
foreach ($eventHandlers as $handler) {
$event->data = $handler[1];
call_user_func($handler[0], $event);
// stop further handling if the event is handled
if ($event->handled) {
return;
}
}
}
// invoke class-level attached handlers
Event::trigger($this, $name, $event);
}
コメントするにはサインアップまたはログインしてください。