コンポーネントから他のコンポーネントを組み込む方法は公式ドキュメントで触れられていますが、詳細が書かれていない上に、メソッドを実装しているのがどこかわからないので引数がわからなかったのでメモ。
他のコンポーネントをロードする方法
下記のようにComponentBase::addComponent()
でロードすることができる。
<?php namespace Pikanji\MyPlugin\Components;
use Cms\Classes\ComponentBase;
class MyComponent extends ComponentBase
{
public function init()
{
$properties = [
"prop1" => "hoge",
"prop2" => "fuga",
];
$cmpAnotherComponent = $this->addComponent(
'Pikanji\MyPlugin\Components\AnotherComponent',
'anotherComponent',
$properties
);
}
}
詳細
いつそのコンポーネントが必要になるかにもよるが、とりあえずinit()
でロードすれば、実際にページやコンポーネントのロジックが実行される前にロードしておけるので安全。
ComponentBase::addComponent()
の詳細は下記の通り
- 第一引数:コンポーネントのクラス名
- 第二引数:任意のコンポーネント名
- 第三引数:コンポーネントのプロパティ
- 返り値:コンポーネントのインスタンス
蛇足
ComponentBase::addComponent()
の実装は、\Cms\Classes\Controller::addComponent()
にある。
ComponentBase
クラスでは実装されていないが、存在しないメソッドが呼び出された時にComponentBase::__call()
が実行され、この中でController
の同名のメソッドが呼び出される仕組みになっている。
おまけ
ロード済みのコンポーネントのインスタンスを取得するメソッドもあるので参考までに。
$cmpAnotherComponent = $this->findComponentByName('AnotherComponent');