Yii行爲(混合) - 小例子

yii中的行爲簡單來說就是在不改變一個component子類的繼承關係的前提下爲其豐富一些屬性及方法

behavior 類

namespace app\behaviors;
use yii\base\Behavior;
//擁有行爲功能必須繼承Behavior類
class BehaviorA extends Behavior
{   //要給其他類注入name和run成員
    public $name = 'i am xiaohuang<br />';

    public function run(){
        echo 'i love runing<br />';
    }
    //當被注入者觸發wake事件時 將會調用run處理器
    public function events()
    {
        return [
            'wake' => 'run',
        ];
    }
}

被注入類

namespace app\behaviors;
use yii\base\Component;
//接收行爲注入必須爲Component子類
class Dog extends Component
{
    public function behaviors()
    {   //可注入多個行爲類(類路徑)
        return [
            BehaviorA::className(),
        ];
    }
    public function sing(){
        echo 'i love sing<br />';
    }
}

控制器

namespace app\controllers;
use app\behaviors\Dog;
use yii\web\Controller;

class TestController extends Controller
{
    public function actionTest(){
        //實例化Dog 測試dog是否擁有注入的成員
        $dog = new Dog();
        //dog觸發wake事件 調用run處理器
        $dog->trigger('wake');//i love runing
        $dog->sing();//i love sing
        $dog->run();//i love runing
        echo $dog->name;
    }
}

怎麼實現對象級別的混合呢 -

1.刪除刪除被注入類的行爲方法 

2.使用component中的attachBehavior() / detachBehavior()

namespace app\controllers;
use app\behaviors\Dog;
use app\behaviors\BehaviorA;
use yii\web\Controller;

class TestController extends Controller
{
    public function actionTest(){
        //實例化Dog
        $dog = new Dog();
        //實例化行爲類
        $behaviorA = new BehaviorA();
        //實現混合(對象注入)
        $dog->attachBehavior('key', $behaviorA);
        //刪除混合成員
        $dog->detachBehavior('key');
        echo $dog->name; //失效
        $dog->run();     //失效
        $dog->sing();    //自身的 有效
    }
}




















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章