配置組件主要包括:
- 指定類。缺少的話使用默認類
- 屬性。缺少的話使用默認類的對應屬性
1 組件簡單理解
urlManager官方文檔介紹
,從官網文檔看到,urlManager是一個類,爲什麼又把它稱爲組件呢?先不用管,我們只需知道,要爲組件指定類即可,如果沒有指定會報錯,除非該組件有默認類,哪些組件有默認類呢?就是核心組件,裝個B看下源碼,以yii高級模板爲例。
Pis:如無特別說明,下面的路徑指的是文件具體路徑,不是命名空間
- 打開
/frontend/web/index.php
,看到
首先,用數組助手類的merge方法遞歸合併數組,後覆蓋前得出最終配置,然後,將配置數據傳到Application
的構造方法裏,再執行其run方法。 - 跳轉到
verdor\yiisoft\yii2\web\Application.php
的run方法,它觸發了很多事件,具體就不看了,貌似無關~,components相關東西在哪?搜索components
,發現執行了coreComponents方法,其內容是
並沒有發現urlManager的默認類,並且各個配置文件都沒爲urlManager指定class,爲什麼沒報錯?因爲它調用了父類的coreComponents
方法。 跳轉到
verdor\yiisoft\yii2\base\Application.php
,原來urlManager組件在這裏指定了類。
我們已經知道是通過
coreComponents
指定核心組件的類了,但它是如何調用這個方法的呢?回頭想想,在入口腳本還幹了什麼?實例化Application
類時,自動調用構造方法!我們發現省略~\web\Application
沒有覆蓋父類的構造方法,即看父類的構造方法跳轉到
preInit
方法,在這個預初始化方法裏,接受的參數是引用,即這個方法要對$config
數組改造,重點看大概意思是,如果配置文件沒有配置某組件或沒有爲某組件指定類,這個組件就用
coreComponents
指定的類。將$config
變量構造好後,傳到Component::__construct($config)
,開始組件的具體內容,就不往下走了。下面看組件屬性的配置,跳到
/項目目錄/frontend/config/main.php
,我們看到urlManager組件配置被註釋掉了,即意味着其使用了urlManager
組件指定類的屬性的默認值,具體在\vendor\yiisoft\yii2\wbe\UrlManager.php
。
小結一下:組件配置,一指定類(無默認就要在配置文件寫明),二配置屬性,屬性就是類的成員變量
2 添加虛擬主機
爲了方便,先給前臺項目添加虛擬主機,具體看鏈接
<VirtualHost *:80>
DocumentRoot "${INSTALL_DIR}/www/advanced/frontend/web/"
ServerName frontend.advanced.com
</VirtualHost>
這步不是必須的~
3 各配置作用
以請求Site
控制器的about
動作爲例子
enablePrettyUrl
:false [默認]:通過入口腳本?r=[模塊/]控制器/動作 方式訪問。即
http://localhost/advanced/frontend/web/index.php?r=site/about
true:開啓美化路由,(注意是僅配置這個爲ture,其他不配置,即用默認),通過入口腳本/[模塊/]控制器/動作 方式訪問。即
http://localhost/advanced/frontend/web/index.php/site/about
Pis:這個設爲false,下面的設置都不起作用
showScriptName
:true [默認]: 不隱藏入口腳本,即要加入口腳本文件名index.php才能訪問到,
http://localhost/advanced/frontend/web/index.php/site/about
false:按理解,設爲false,應該是
http://localhost/advanced/frontend/web/site/about
即可訪問,但發現是apache提示找不到頁面,
這意味着,apache服務器找不到url請求的文件,按apache理解,省略~/web/
下沒有site
目錄,所以,想要實現隱藏入口腳本,還要在/frontend/web/
下添加.htaccess
文件,官方文檔介紹,具體步驟如下:- 在
.htaccess
添加內容如下,意思是,如果請求的文件或目錄找不到,就轉到index.php
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php
- 在
完成後,才能通過
http://frontend.advanced.com/site/about
訪問enableStrictParsing
:false [默認]:不啓用嚴格解析路由,意思是,如果請求url與所有
rules
規則都不匹配的話,就按照默認的路由處理方式來處理,即按[模塊/]控制器/動作,方式去解析url。true:設爲true後,當請求url與
rules
規則不匹配,就報錯。如,通過
http://frontend.advanced.com/site/about
請求,得到Yii框架的報錯提示
這意味着,請求經過apache的轉發,已經找到目的文件(入口腳本),目的文件運行過程中,沒有得到期望參數(沒傳或驗證不通過),因此Yii框架拋異常了。
注意與上面apache提示找不到頁面區分~
suffix
: 後綴名,如設置爲suffix => '.html
,需通過http://frontend.advanced.com/site/about.html
才能訪問到rules
: 規則的配置就很複雜了,下面詳講。
4 rules
配置
想訪問
Site
的about
動作,要在rules里加'site/about' => 'site/about'
其中,左邊稱爲
pattern
,對應輸入的url,右邊爲route
,對應[模型/]控制器/動作。如果不想爲每個動作都加一個規則,可以這樣
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
可以這樣理解,左邊,接收請求url的對應值,對它們作
\w
驗證,即必須是字母或數字或下劃線,以/site/about
爲例,驗證通過,賦值給臨時變量controller
,action
,右邊使用,從而找到Site
控制器的about
動作。同理,模塊下的控制器動作也可以這樣實現
'<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
restful的路由規則,在研究,日後再補~
5 Notice
suffix
設了.html
, 下面的rules都會用到,要想不用,需要在規則數組單獨聲明suffix=> ''
- restful路由配置,
pluralize
參數默認爲true,假如控制器爲UserController
,要通過users
的url才能訪問到,設爲false的話,就不用加s,通過user
即可訪問,如果控制器本來就是UsersController
,不管pluralize
如何配置,都是通過users
訪問