亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

ディレクトリ 検索
閱讀前篇 簡介 Yii 是什么 從 Yii 1.1 升級 入門 安裝 Yii 運行應(yīng)用 第一次問候 使用Forms 數(shù)據(jù)庫應(yīng)用 使用 Gii 生成代碼 進(jìn)階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴(kuò)展(Extensions) 請求處理 運行概述 啟動引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動加載(Autoloading) 服務(wù)定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫工作 數(shù)據(jù)庫訪問 (Data Access Objects) 查詢生成器(Query Builder) 活動記錄(Active Record) 數(shù)據(jù)庫遷移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用戶數(shù)據(jù) 創(chuàng)建表單(Creating Forms) 輸入驗證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復(fù)合表單(Getting Data for Multiple Models) 顯示數(shù)據(jù) 格式化輸出數(shù)據(jù)(Data Formatting) 分頁(Pagination) 排序(Sorting) 數(shù)據(jù)提供器(Data Providers) 數(shù)據(jù)小部件(Data Widgets) 客戶端腳本使用(Working with Client Scripts) 主題(Theming) 安全 認(rèn)證(Authentication) 授權(quán)(Authorization) 處理密碼(Working with Passwords) 客戶端認(rèn)證(Auth Clients) 最佳安全實踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯誤處理(Error Handling) 開發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測試 概述(Overview) 配置測試環(huán)境(Testing environment setup) 單元測試(Unit Tests) 功能測試(Function Tests) 驗收測試(Acceptance Tests) 測試夾具(Fixtures) 高級專題 高級應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺命令 核心驗證器(Core Validators) 國際化 收發(fā)郵件 性能優(yōu)化 共享主機(jī)環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
テキスト

行為

行為

行為是 yii\base\Behavior 或其子類的實例。行為,也稱為?mixins,可以無須改變類繼承關(guān)系即可增強(qiáng)一個已有的 yii\base\Component 類功能。當(dāng)行為附加到組件后,它將“注入”它的方法和屬性到組件,然后可以像訪問組件內(nèi)定義的方法和屬性一樣訪問它們。此外,行為通過組件能響應(yīng)被觸發(fā)的事件,從而自定義或調(diào)整組件正常執(zhí)行的代碼。

定義行為

要定義行為,通過繼承 yii\base\Behavior 或其子類來建立一個類。如:

namespace app\components;

use yii\base\Behavior;

class MyBehavior extends Behavior{
    public $prop1;

    private $_prop2;

    public function getProp2()
    {
        return $this->_prop2;
    }

    public function setProp2($value)
    {
        $this->_prop2 = $value;
    }

    public function foo()
    {
        // ...
    }
}

以上代碼定義了行為類?app\components\MyBehavior?并為要附加行為的組件提供了兩個屬性?prop1?、?prop2?和一個方法?foo()?。注意屬性?prop2?是通過 getter?getProp2()?和 setter?setProp2()?定義的。能這樣用是因為 yii\base\Object 是 yii\base\Behavior 的祖先類,此祖先類支持用 getter 和 setter 方法定義屬性

提示:在行為內(nèi)部可以通過 yii\base\Behavior::owner 屬性訪問行為已附加的組件。

處理事件

如果要讓行為響應(yīng)對應(yīng)組件的事件觸發(fā),就應(yīng)覆寫 yii\base\Behavior::events() 方法,如:

namespace app\components;

use yii\db\ActiveRecord;
use yii\base\Behavior;

class MyBehavior extends Behavior{
    // 其它代碼

    public function events()
    {
        return [
            ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
        ];
    }

    public function beforeValidate($event)
    {
        // 處理器方法邏輯
    }
}

yii\base\Behavior::events() 方法返回事件列表和相應(yīng)的處理器。上例聲明了 yii\db\ActiveRecord::EVENT_BEFORE_VALIDATE 事件和它的處理器?beforeValidate()?。當(dāng)指定一個事件處理器時,要使用以下格式之一:

  • 指向行為類的方法名的字符串,如上例所示;
  • 對象或類名和方法名的數(shù)組,如?[$object, 'methodName'];
  • 匿名方法。

處理器的格式如下,其中?$event?指向事件參數(shù)。關(guān)于事件的更多細(xì)節(jié)請參考事件:

function ($event) {
}

附加行為

可以靜態(tài)或動態(tài)地附加行為到y(tǒng)ii\base\Component。前者在實踐中更常見。

要靜態(tài)附加行為,覆寫行為要附加的組件類的 yii\base\Component::behaviors() 方法即可。yii\base\Component::behaviors() 方法應(yīng)該返回行為配置列表。每個行為配置可以是行為類名也可以是配置數(shù)組。如:

namespace app\models;

use yii\db\ActiveRecord;
use app\components\MyBehavior;

class User extends ActiveRecord{
    public function behaviors()
    {
        return [
            // 匿名行為,只有行為類名
            MyBehavior::className(),

            // 命名行為,只有行為類名
            'myBehavior2' => MyBehavior::className(),

            // 匿名行為,配置數(shù)組
            [
                'class' => MyBehavior::className(),
                'prop1' => 'value1',
                'prop2' => 'value2',
            ],

            // 命名行為,配置數(shù)組
            'myBehavior4' => [
                'class' => MyBehavior::className(),
                'prop1' => 'value1',
                'prop2' => 'value2',
            ]
        ];
    }
}

通過指定行為配置數(shù)組相應(yīng)的鍵可以給行為關(guān)聯(lián)一個名稱。這種行為稱為命名行為。上例中,有兩個命名行為:myBehavior2?和myBehavior4?。如果行為沒有指定名稱就是匿名行為

要動態(tài)附加行為,在對應(yīng)組件里調(diào)用 yii\base\Component::attachBehavior() 方法即可,如:

use app\components\MyBehavior;

// 附加行為對象$component->attachBehavior('myBehavior1', new MyBehavior);

// 附加行為類$component->attachBehavior('myBehavior2', MyBehavior::className());

// 附加配置數(shù)組$component->attachBehavior('myBehavior3', [
    'class' => MyBehavior::className(),
    'prop1' => 'value1',
    'prop2' => 'value2',
]);

可以通過 yii\base\Component::attachBehaviors() 方法一次附加多個行為:

$component->attachBehaviors([
    'myBehavior1' => new MyBehavior,  // 命名行為
    MyBehavior::className(),          // 匿名行為
]);

還可以通過配置去附加行為:

[
    'as myBehavior2' => MyBehavior::className(),

    'as myBehavior3' => [
        'class' => MyBehavior::className(),
        'prop1' => 'value1',
        'prop2' => 'value2',
    ],
]

詳情請參考配置章節(jié)。

使用行為

使用行為,必須像前文描述的一樣先把它附加到 yii\base\Component 類或其子類。一旦行為附加到組件,就可以直接使用它。

行為附加到組件后,可以通過組件訪問一個行為的公共成員變量或 getter 和 setter 方法定義的屬性:

// "prop1" 是定義在行為類的屬性echo $component->prop1;
$component->prop1 = $value;

類似地也可以調(diào)用行為的公共方法:

// foo() 是定義在行為類的公共方法$component->foo();

如你所見,盡管?$component?未定義?prop1?和?foo()?,它們用起來也像組件自己定義的一樣。

如果兩個行為都定義了一樣的屬性或方法,并且它們都附加到同一個組件,那么首先附加上的行為在屬性或方法被訪問時有優(yōu)先權(quán)。

附加行為到組件時的命名行為,可以使用這個名稱來訪問行為對象,如下所示:

$behavior = $component->getBehavior('myBehavior');

也能獲取附加到這個組件的所有行為:

$behaviors = $component->getBehaviors();

移除行為

要移除行為,可以調(diào)用 yii\base\Component::detachBehavior() 方法用行為相關(guān)聯(lián)的名字實現(xiàn):

$component->detachBehavior('myBehavior1');

也可以移除全部行為:

$component->detachBehaviors();

使用?TimestampBehavior

最后以 yii\behaviors\TimestampBehavior 的講解來結(jié)尾,這個行為支持在 yii\db\ActiveRecord 存儲時自動更新它的時間戳屬性。

首先,附加這個行為到計劃使用該行為的 yii\db\ActiveRecord 類:

namespace app\models\User;

use yii\db\ActiveRecord;
use yii\behaviors\TimestampBehavior;

class User extends ActiveRecord{
    // ...

    public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                    ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
                ],
            ],
        ];
    }
}

以上指定的行為數(shù)組:

  • 當(dāng)記錄插入時,行為將當(dāng)前時間戳賦值給?created_at?和?updated_at?屬性;
  • 當(dāng)記錄更新時,行為將當(dāng)前時間戳賦值給?updated_at?屬性。

保存?User?對象,將會發(fā)現(xiàn)它的?created_at?和?updated_at?屬性自動填充了當(dāng)前時間戳:

$user = new User;
$user->email = 'test@example.com';
$user->save();
echo $user->created_at;  // 顯示當(dāng)前時間戳

yii\behaviors\TimestampBehavior 行為還提供了一個有用的方法 yii\behaviors\TimestampBehavior::touch(),這個方法能將當(dāng)前時間戳賦值給指定屬性并保存到數(shù)據(jù)庫:

$user->touch('login_time');

與 PHP traits 的比較

盡管行為在 "注入" 屬性和方法到主類方面類似于?traits?,它們在很多方面卻不相同。如上所述,它們各有利弊。它們更像是互補(bǔ)的而不是相互替代。

行為的優(yōu)勢

行為類像普通類支持繼承。另一方面,traits 可以視為 PHP 語言支持的復(fù)制粘貼功能,它不支持繼承。

行為無須修改組件類就可動態(tài)附加到組件或移除。要使用 traits,必須修改使用它的類。

行為是可配置的而 traits 不能。

行為以響應(yīng)事件來自定義組件的代碼執(zhí)行。

當(dāng)不同行為附加到同一組件產(chǎn)生命名沖突時,這個沖突通過先附加行為的優(yōu)先權(quán)自動解決。而由不同 traits 引發(fā)的命名沖突需要通過手工重命名沖突屬性或方法來解決。

traits 的優(yōu)勢

traits 比起行為更高效,因為行為是對象,消耗時間和內(nèi)存。

IDE 對 traits 更友好,因為它們是語言結(jié)構(gòu)。
前の記事: 次の記事: