過濾器
過濾器是控制器動作執行之前或之后執行的對象。 例如訪問控制過濾器可在動作執行之前來控制特殊終端用戶是否有權限執行動作, 內容壓縮過濾器可在動作執行之后發給終端用戶之前壓縮響應內容。? ? ? ? ? ? ? ?(推薦學習:yii框架)
過濾器可包含預過濾(過濾邏輯在動作之前)或后過濾(過濾邏輯在動作之后), 也可同時包含兩者。
使用過濾器
過濾器本質上是一類特殊的 行為, 所以使用過濾器和 使用行為一樣。 可以在控制器類中覆蓋它的 behaviors() 方法來聲明過濾器,如下所示:
public?function?behaviors() { ????return?[ ????????[ ????????????'class'?=>?'yiifiltersHttpCache', ????????????'only'?=>?['index',?'view'], ????????????'lastModified'?=>?function?($action,?$params)?{ ????????????????$q?=?new?yiidbQuery(); ????????????????return?$q->from('user')->max('updated_at'); ????????????}, ????????], ????]; }
控制器類的過濾器默認應用到該類的 所有 動作, 你可以配置 only 屬性明確指定控制器應用到哪些動作。 在上述例子中,HttpCache 過濾器只應用到 index 和 view 動作。 也可以配置 except 屬性 使一些動作不執行過濾器。
除了控制器外,可在 模塊或應用主體 中申明過濾器。 申明之后,過濾器會應用到所屬該模塊或應用主體的 所有 控制器動作, 除非像上述一樣配置過濾器的 only 和 except 屬性。
注意: 在模塊或應用主體中申明過濾器,在only 和 except 屬性中使用路由 代替動作 ID, 因為在模塊或應用主體中只用動作ID并不能唯一指定到具體動作。
當一個動作有多個過濾器時,根據以下規則先后執行:
預過濾
按順序執行應用主體中 behaviors() 列出的過濾器。
按順序執行模塊中 behaviors() 列出的過濾器。
按順序執行控制器中 behaviors() 列出的過濾器。
如果任意過濾器終止動作執行, 后面的過濾器(包括預過濾和后過濾)不再執行。
成功通過預過濾后執行動作。
后過濾
倒序執行控制器中 behaviors() 列出的過濾器。
倒序執行模塊中 behaviors() 列出的過濾器。
倒序執行應用主體中 behaviors() 列出的過濾器。