Yii - 模擬元件呼叫注入
阿新 • • 發佈:2018-11-30
yii 中元件只有在被呼叫的時候才會被例項化,且在當前請求中之後呼叫該元件只會使用上一次例項化的例項,不會重新生成該例項。
'components' => array(
'元件呼叫名' => '元件呼叫名稱空間',
'元件呼叫名' => array(
'class' => '元件呼叫名稱空間'
);
'元件呼叫名' => function(){
return new '元件呼叫名稱空間';
}
)
一個類似的小元件,可以實現上述功能。方便我們儲存服務功能元件。
<?php
namespace app\components\Services;
/**
* 自定義服務層呼叫元件
* 支援 的例項模式只有yii模式的string 和 array 模式
* 例子
* services => array(
* 'customService' => array(
* 'class' => 'app\components\Custom\Custom',
* 'name' => '我是勇哥'
* ),
* )
*/
class Services
{
private $dataObj = array();
private $classes = array();
public function __set($name,$value)
{
$this->classes[$name] = $value;
}
public function __get($name)
{
if(!isset($this->dataObj[$name]) || $this->dataObj[$name] == null)
{
$classInfo = $this->classes[$name];
$this->dataObj[$name] = is_array($classInfo) ? (new $classInfo['class']) : (new $classInfo);
if(is_array($classInfo))
foreach($classInfo as $a=>$b)
if($a != 'class')
$this->dataObj[$name]->$a = $b;
}
return $this->dataObj[$name];
}
}
web.php
'components'=>array(
'services' => array(
'class' => 'app\components\Services\Services',
//自定義服務 custom1
'custom1Service' => array(
'class' => 'app\services\Custom1\Custom1',
//需要注入的屬性值
'name' => '我是勇哥',
'age' => 22
),
//自定義服務 custom2
'custom2Service' => array(
'class' => 'app\services\Custom2\Custom2',
//需要注入的屬性值
'name' => '我是勇哥',
'age' => 22
),
)
)
控制層呼叫
<?php
namespace app\controllers\home;
use Yii;
use yii\web\Controller;
class IndexController extends Controller
{
public function actionIndex()
{
echo Yii::$app->services->custom1Service->name;
}
}