本節包含以下方面的内容
基本概念
路由
預設路由
動作的參數
在動作中定義參數
從請求(request)中擷取參數
獨立動作
動作過濾器(action filters)
捕獲所有的請求
自定義響應類
控制器(control)是應用程式中最關鍵的部分之一,它決定了如何處理傳遞進來的請求(request),以及生成相應的響應(response)。
大部分的控制器都會處理一個http的請求,然後傳回html或者json或者xml格式的資料作為響應。
1、基本概念
控制器檔案一般在應用程式的controllers目錄下面,檔案命名規則為xxxcontroller.php,其中xxx可以為任意的名稱,後面的controller是固定格式,不能少一個單詞。
一個基本的控制器的定義要從yii\web\controller繼承,如
一般來說控制器裡面定義的動作都是 actionsomething格式的公共的方法。輸出的資料可以是一個字元串或者yii\web\response的執行個體。
動作輸出的結果将會由
response元件處理并轉換成不同的資料格式如json等。預設情況下是沒有對動作的執行結果進行處理的。
2、路由
每個控制器裡面的動作都有一個相對應的路由,在上面的例子中actionindex有一個對應的site/index路由,actiontest對應的路由是site/test。在這個路由中site為控制器的id,test為動作的id。
一般情況下可以通過這個格式的url來通路控制器和動作。http://example.com/?r=controller/action。當然你可以完全自定義url的格式(url
management.)。
如果控制器是在一個子產品裡面,那麼對應的路由格式為module/controller/action。
控制器還可以存在于應用程式或者子產品的控制器目錄下面的子目錄裡。這種路由的格式前面就需要加上相應的目錄名稱。例如在controllers/admin下面有個usercontroller,那麼動作actionindex相應的路由為admin/user/index。admin/user為控制器的id.
如果子產品或者控制器或者動作都沒有找到,yii将會傳回一個"not
found" 頁面,并且傳回的http代碼為404。
注意: 如果子產品名稱或者控制器名稱或者動作名稱是用的駱駝格式的命名寫法,那麼路由裡面的每個大寫單詞之間都要用“-”來連接配接。如 datetimecontroller::actionfastforward 相應的路由為 date-time/fast-forward。
1、預設路由
如果一個url沒有指定路由,如,那麼yii将會使用預設的路由。
yii在應用程式裡面定義了預設的路由。預設的路由為site由yii\web\application::
$defaultroute定義,即控制器sitecontroller将會被使用。
有預設的路由也就會有預設的動作了。每個控制器都有一個預設的動作。如果在url中沒有指定動作的話,那麼将會調用預設的動作。
預設的動作名為index,在yii\base\controller::
$defaultaction中定義。
如,隻指定了路由為site,那麼将會使用預設的動作index,即将會調用sitecontroller裡面的actionindex方法
3、動作參數
就像上面提到的一樣,一個簡單的動作就是一個以actionxxx格式命名的公開的方法。那麼動作如何從http的請求中擷取想要的參數呢?
1、動作中定義參數
在定義動作的時候直接定義參數。這個參數的值會直接從$_get裡面擷取對應的值。也就是說動作裡面定義的參數隻能從$_get裡面擷取值。
如上所示動作view定義了兩個參數$id和$version。其中$version的預設值為null。
我們可以通過或者來通路。
在第一種情況下由于沒有version參數,将會使用在定義的時候的預設值。而在第二種情況下actionview裡面将得到相應的值,$id為42,$version為3.
如果在動作裡面定義的參數沒有預設值,而通路的url裡面又沒有相對應的變量,那麼會抛一個異常。如由于沒有在url中指定id,在action的定義中又沒有預設的值,是以将會抛一個異常。
2、從請求(request)中擷取參數
如果要從post中擷取參數或者get裡面的參數太多,還可以c通過yii裡面的request對象來擷取相關的參數,可以通過\yii:: $app->request來通路。如下代碼所示:
4、獨立動作(action)
如果一個動作是通用的,要想在其它的控制器中重複使用,可以把這個動作放在一個單獨的檔案中實作。
建立actions/page.php
使用:
actions()傳回的是一個name-value數組,name為動作(action)的名稱,class為實作的動作的類,view為action要使用的模闆檔案。
通路:
5、動作過濾器(action
filters)
你可能需要對控制器裡面的某些動作應用一些過濾器,例如判斷對目前動作的通路權限,對動作傳回結果進一步處理等。
動作過濾器是yii\base\actionfilter的子類的執行個體。
要使用動作過濾器,可以把它像行為一樣附加在控制器或者子產品上。下面這個例子實作了對index動作的緩存
你還可以同時使用多個動作過濾器。他們将按照在behaviors()裡面定義的先後順序依次執行。如果其中的任意一個過濾器取消了動作的執行,那麼目前過濾器後面的所有的過濾器将不會被執行。同時這個動作也不會執行。
當附加一個過濾器到控制器的時候,這個過濾器可以應該于目前控制器裡面所有的動作。如果附加到子產品或者應用程式,這個過濾器就可以應用于這個子產品或者應用程式下面的所有的動作。
要建立動作過濾器,從yii\base\actionfilter繼承并實作beforeaction() 和afteraction()方法。beforaction将在action執行之前執行,同理afteraction将在action執行之後執行。如果beforeaction()傳回false,那麼目前過濾器後面的所有的過濾器都将不會被執行,并且action也不會被執行。
authorization 章節介紹了yii\filters\accesscontrol 過濾器,caching章節介紹了yii\filters\pagecache和yii\filters\httpcache過濾器。在實作自定義的過濾器的時候可以參考這些内置的過濾器的實作。
6、捕獲所有的請求
有時候用一個控制器和動作來處理所有的請求是非常有用的。例如在網站在處于維護的情況下顯示一個通知等。如果要實作這個功能隻需要設定應用程式的catchall屬性就可以了。有兩種方式可以設定catchall屬性,動态的設定或者在配置檔案裡面設定。
上面的例子是通過配置檔案來設定的。offline/notice的意思是指使用offlinecontroller::actionnotice(),param1 和 param2 是傳遞給notice動作方法的參數。
7、自定義響應類
一般在動作執行完後會傳回一個render之後的html内容,當然還可以傳回特定的響應