yii2行為機制由淺入深 - 從一個屬性開始

阿北哥ya發表於2017-08-02

先給自己小廣告下,明天我在sf的講座晚8點開始,講解yii2的許可權管理擴充套件yii2-admin,感興趣的看下
segmentfault.com/l/150000001…

其實行為這部分不是特別好講,如果從內往外講,估計一大批人都會蒙圈,如果從例子講,又很難有貼合的例子,畢竟行為不是解決一個需求的唯一途徑,它只是一個可選項,一個不影響現有類的一種擴充套件機制。

想來想去,我們還是從一個屬性開始吧。

那就開始吧

好的,之前我們說過,行為是一個類,它注入到yii的元件類併為其增加功能,那就是說在行為的世界裡一定有兩種角色。

  • 行為類 擁有一些功能,可以注入到元件類
  • 元件類 我們想增強功能的類

當然,yii對於行為類是一定約束的,如果你要構造一個行為類,必須遵從它。我們用一個例子說明。

行為類,必須繼承於 yii\base\Behavior 類。比如下面的這個行為類

// @app\components\HelloBehavior.php
namespace app\components;

use yii\base\Behavior;

class HelloBehavior extends Behavior {
    public $name = "abei2017";
}複製程式碼

我們定義了一個最簡單的行為類,其實它還可以有方法、有事件等等,比如上上篇我們說的TimestampBehavior等行為類就用了事件。

下面我們想做一件事情,將 HelloBehavior 注入到一個 User 模型中,並使用行為類的$name屬性,就像下面這樣

$model = new User();
echo $model->name; // abei2017複製程式碼

繫結它

如果想實現這種注入,那也是有要求的,首先這個類必須繼承於元件類,就是必須是yii\base\Component的子類。

一句話歸納:Behavior只能與Component類繫結

不過你不用擔心,在yii2中,大多數類都是Component的子類,比如最常用的ActiveRecord等。

那麼開始吧,現在有了行為類 HelloBehavior ,我們為模型User注入這個行為,使用其 $name 屬性,看下面程式碼

// @app/models/User
use app\components\HelloBehavior;

class User extends \yii\db\ActiveRecord
{
    .....
    public function behaviors()
    {
        return [
            HelloBehavior::className()
        ];
    }
    ....
}複製程式碼

就想上面這段程式碼一樣,我們只需要過載其父類的behaviors方法,將行為類加進去就ok了。當然,繫結有很多方式,這裡是最簡單的。

現在開始使用吧

現在在一個action中,我寫下了如下程式碼

namespace app\controllers;

use app\models\User;
use yii\web\Controller;

class XXXController extends Controller {

    public function actionIndex(){
        $model = new User();
        echo $model->name;

    }
}複製程式碼

如我所願

alt
alt

這僅僅是開始

是的,這僅僅是開始,上面是最簡單的一個行為的例子,我們由淺入深的拿下它。

下一篇我們將擴充套件上面例子中的繫結部分,為你講解元件繫結行為的各種方式。

相關文章