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

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

過濾器

過濾器

過濾器是?控制器 動作?執(zhí)行之前或之后執(zhí)行的對象。 例如訪問控制過濾器可在動作執(zhí)行之前來控制特殊終端用戶是否有權限執(zhí)行動作, 內容壓縮過濾器可在動作執(zhí)行之后發(fā)給終端用戶之前壓縮響應內容。

過濾器可包含 預過濾(過濾邏輯在動作之前) 或 后過濾(過濾邏輯在動作之后),也可同時包含兩者。

使用過濾器

過濾器本質上是一類特殊的?行為,所以使用過濾器和?使用 行為一樣。 可以在控制器類中覆蓋它的 yii\base\Controller::behaviors() 方法來申明過濾器,如下所示:

public function behaviors(){
    return [
        [
            'class' => 'yii\filters\HttpCache',
            'only' => ['index', 'view'],
            'lastModified' => function ($action, $params) {
                $q = new \yii\db\Query();
                return $q->from('user')->max('updated_at');
            },
        ],
    ];
}

控制器類的過濾器默認應用到該類的?所有?動作,你可以配置yii\base\ActionFilter::only屬性明確指定控制器應用到哪些動作。 在上述例子中,HttpCache?過濾器只應用到indexview動作。 也可以配置yii\base\ActionFilter::except屬性使一些動作不執(zhí)行過濾器。

除了控制器外,可在?模塊或應用主體?中申明過濾器。 申明之后,過濾器會應用到所屬該模塊或應用主體的?所有?控制器動作, 除非像上述一樣配置過濾器的 yii\base\ActionFilter::only 和 yii\base\ActionFilter::except 屬性。

補充: 在模塊或應用主體中申明過濾器,在yii\base\ActionFilter::only 和 yii\base\ActionFilter::except 屬性中使用路由?代替動作ID, 因為在模塊或應用主體中只用動作ID并不能唯一指定到具體動作。.

當一個動作有多個過濾器時,根據以下規(guī)則先后執(zhí)行:

  • 預過濾
    • 按順序執(zhí)行應用主體中behaviors()列出的過濾器。
    • 按順序執(zhí)行模塊中behaviors()列出的過濾器。
    • 按順序執(zhí)行控制器中behaviors()列出的過濾器。
    • 如果任意過濾器終止動作執(zhí)行,后面的過濾器(包括預過濾和后過濾)不再執(zhí)行。
  • 成功通過預過濾后執(zhí)行動作。
  • 后過濾
    • 倒序執(zhí)行控制器中behaviors()列出的過濾器。
    • 倒序執(zhí)行模塊中behaviors()列出的過濾器。
    • 倒序執(zhí)行應用主體中behaviors()列出的過濾器。

創(chuàng)建過濾器

繼承 yii\base\ActionFilter 類并覆蓋 yii\base\ActionFilter::beforeAction() 和/或 yii\base\ActionFilter::afterAction() 方法來創(chuàng)建動作的過濾器,前者在動作執(zhí)行之前執(zhí)行,后者在動作執(zhí)行之后執(zhí)行。 yii\base\ActionFilter::beforeAction() 返回值決定動作是否應該執(zhí)行, 如果為false,之后的過濾器和動作不會繼續(xù)執(zhí)行。

下面的例子申明一個記錄動作執(zhí)行時間日志的過濾器。

namespace app\components;

use Yii;
use yii\base\ActionFilter;

class ActionTimeFilter extends ActionFilter{
    private $_startTime;

    public function beforeAction($action)
    {
        $this->_startTime = microtime(true);
        return parent::beforeAction($action);
    }

    public function afterAction($action, $result)
    {
        $time = microtime(true) - $this->_startTime;
        Yii::trace("Action '{$action->uniqueId}' spent $time second.");
        return parent::afterAction($action, $result);
    }
}

核心過濾器

Yii提供了一組常用過濾器,在yii\filters命名空間下,接下來我們簡要介紹這些過濾器。

yii\filters\AccessControl

AccessControl提供基于yii\filters\AccessControl::rules規(guī)則的訪問控制。 特別是在動作執(zhí)行之前,訪問控制會檢測所有規(guī)則并找到第一個符合上下文的變量(比如用戶IP地址、登錄狀態(tài)等等)的規(guī)則, 來決定允許還是拒絕請求動作的執(zhí)行,如果沒有規(guī)則符合,訪問就會被拒絕。

如下示例表示表示允許已認證用戶訪問create?和?update?動作,拒絕其他用戶訪問這兩個動作。

use yii\filters\AccessControl;

public function behaviors(){
    return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['create', 'update'],
            'rules' => [
                // 允許認證用戶
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
                // 默認禁止其他用戶
            ],
        ],
    ];
}

更多關于訪問控制的詳情請參閱?授權?一節(jié)。

認證方法過濾器

認證方法過濾器通過HTTP Basic Auth或OAuth 2?來認證一個用戶,認證方法過濾器類在?yii\filters\auth?命名空間下。

如下示例表示可使用yii\filters\auth\HttpBasicAuth來認證一個用戶,它使用基于HTTP基礎認證方法的令牌。 注意為了可運行,yii\web\User::identityClass 類必須 實現(xiàn) yii\web\IdentityInterface::findIdentityByAccessToken()方法。

use yii\filters\auth\HttpBasicAuth;

public function behaviors(){
    return [
        'basicAuth' => [
            'class' => HttpBasicAuth::className(),
        ],
    ];
}

認證方法過濾器通常在實現(xiàn)RESTful API中使用,更多關于訪問控制的詳情請參閱 RESTful?認證?一節(jié)。

yii\filters\ContentNegotiator

ContentNegotiator支持響應內容格式處理和語言處理。 通過檢查?GET?參數(shù)和?Accept?HTTP頭部來決定響應內容格式和語言。

如下示例,配置ContentNegotiator支持JSON和XML響應格式和英語(美國)和德語。

use yii\filters\ContentNegotiator;
use yii\web\Response;

public function behaviors(){
    return [
        [
            'class' => ContentNegotiator::className(),
            'formats' => [
                'application/json' => Response::FORMAT_JSON,
                'application/xml' => Response::FORMAT_XML,
            ],
            'languages' => [
                'en-US',
                'de',
            ],
        ],
    ];
}

在應用主體生命周期過程中檢測響應格式和語言簡單很多, 因此ContentNegotiator設計可被引導啟動組件調用的過濾器。 如下例所示可以將它配置在應用主體配置。

use yii\filters\ContentNegotiator;
use yii\web\Response;

[
    'bootstrap' => [
        [
            'class' => ContentNegotiator::className(),
            'formats' => [
                'application/json' => Response::FORMAT_JSON,
                'application/xml' => Response::FORMAT_XML,
            ],
            'languages' => [
                'en-US',
                'de',
            ],
        ],
    ],
];

補充: 如果請求中沒有檢測到內容格式和語言,使用formats和languages第一個配置項。

yii\filters\HttpCache

HttpCache利用Last-Modified?和?Etag?HTTP頭實現(xiàn)客戶端緩存。例如:

use yii\filters\HttpCache;

public function behaviors(){
    return [
        [
            'class' => HttpCache::className(),
            'only' => ['index'],
            'lastModified' => function ($action, $params) {
                $q = new \yii\db\Query();
                return $q->from('user')->max('updated_at');
            },
        ],
    ];
}

更多關于使用HttpCache詳情請參閱?HTTP 緩存?一節(jié)。

yii\filters\PageCache

PageCache實現(xiàn)服務器端整個頁面的緩存。如下示例所示,PageCache應用在index動作, 緩存整個頁面60秒或post表的記錄數(shù)發(fā)生變化。它也會根據不同應用語言保存不同的頁面版本。

use yii\filters\PageCache;
use yii\caching\DbDependency;

public function behaviors(){
    return [
        'pageCache' => [
            'class' => PageCache::className(),
            'only' => ['index'],
            'duration' => 60,
            'dependency' => [
                'class' => DbDependency::className(),
                'sql' => 'SELECT COUNT(*) FROM post',
            ],
            'variations' => [
                \Yii::$app->language,
            ]
        ],
    ];
}

更多關于使用PageCache詳情請參閱?頁面緩存?一節(jié)。

yii\filters\RateLimiter

RateLimiter 根據?漏桶算法?來實現(xiàn)速率限制。 主要用在實現(xiàn)RESTful APIs,更多關于該過濾器詳情請參閱?Rate Limiting?一節(jié)。

yii\filters\VerbFilter

VerbFilter檢查請求動作的HTTP請求方式是否允許執(zhí)行,如果不允許,會拋出HTTP 405異常。 如下示例,VerbFilter指定CRUD動作所允許的請求方式。

use yii\filters\VerbFilter;

public function behaviors(){
    return [
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'index'  => ['get'],
                'view'   => ['get'],
                'create' => ['get', 'post'],
                'update' => ['get', 'put', 'post'],
                'delete' => ['post', 'delete'],
            ],
        ],
    ];
}

yii\filters\Cors

跨域資源共享?CORS?機制允許一個網頁的許多資源(例如字體、JavaScript等) 這些資源可以通過其他域名訪問獲取。 特別是JavaScript's AJAX 調用可使用 XMLHttpRequest 機制,由于同源安全策略該跨域請求會被網頁瀏覽器禁止. CORS定義瀏覽器和服務器交互時哪些跨域請求允許和禁止。

yii\filters\Cors 應在 授權 / 認證 過濾器之前定義,以保證CORS頭部被發(fā)送。

use yii\filters\Cors;
use yii\helpers\ArrayHelper;

public function behaviors(){
    return ArrayHelper::merge([
        [
            'class' => Cors::className(),
        ],
    ], parent::behaviors());
}

Cors 可轉為使用?cors?屬性。

  • cors['Origin']: 定義允許來源的數(shù)組,可為['*']?(任何用戶) 或?['http://www.myserver.net', 'http://www.myotherserver.com']. 默認為?['*'].
  • cors['Access-Control-Request-Method']: 允許動作數(shù)組如?['GET', 'OPTIONS', 'HEAD']. 默認為?['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'].
  • cors['Access-Control-Request-Headers']: 允許請求頭部數(shù)組,可為?['*']?所有類型頭部 或?['X-Request-With']?指定類型頭部. 默認為?['*'].
  • cors['Access-Control-Allow-Credentials']: 定義當前請求是否使用證書,可為?true,?false?或?null?(不設置). 默認為?null.
  • cors['Access-Control-Max-Age']: 定義請求的有效時間,默認為?86400.

例如,允許來源為?http://www.myserver.net?和方式為?GET,?HEAD?和?OPTIONS?的CORS如下:

use yii\filters\Cors;
use yii\helpers\ArrayHelper;

public function behaviors(){
    return ArrayHelper::merge([
        [
            'class' => Cors::className(),
            'cors' => [
                'Origin' => ['http://www.myserver.net'],
                'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],
            ],
        ],
    ], parent::behaviors());
}

可以覆蓋默認參數(shù)為每個動作調整CORS 頭部。例如,為login動作增加Access-Control-Allow-Credentials參數(shù)如下所示:

use?yii\filters\Cors;
use?yii\helpers\ArrayHelper;

public?function?behaviors(){
? ? return?ArrayHelper::merge([
? ? ? ? [
? ? ? ? ? ? 'class'?=>?Cors::className(),
? ? ? ? ? ? 'cors'?=>?[
? ? ? ? ? ? ? ? 'Origin'?=>?['http://www.myserver.net'],
? ? ? ? ? ? ? ? 'Access-Control-Request-Method'?=>?['GET',?'HEAD',?'OPTIONS'],
? ? ? ? ? ? ],
? ? ? ? ? ? 'actions'?=>?[
? ? ? ? ? ? ? ? 'login'?=>?[
? ? ? ? ? ? ? ? ? ? 'Access-Control-Allow-Credentials'?=>?true,
? ? ? ? ? ? ? ? ]
? ? ? ? ? ? ]
? ? ? ? ],
? ? ],?parent::behaviors());
}
前の記事: 次の記事: