先給自己小廣告下,明天我在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;
}
}複製程式碼
如我所願
這僅僅是開始
是的,這僅僅是開始,上面是最簡單的一個行為的例子,我們由淺入深的拿下它。
下一篇我們將擴充套件上面例子中的繫結部分,為你講解元件繫結行為的各種方式。