yii的urlManager組件配置

配置組件主要包括:

  • 指定類。缺少的話使用默認類
  • 屬性。缺少的話使用默認類的對應屬性

1 組件簡單理解

urlManager官方文檔介紹
,從官網文檔看到,urlManager是一個類,爲什麼又把它稱爲組件呢?先不用管,我們只需知道,要爲組件指定類即可,如果沒有指定會報錯,除非該組件有默認類,哪些組件有默認類呢?就是核心組件,裝個B看下源碼,以yii高級模板爲例。

Pis:如無特別說明,下面的路徑指的是文件具體路徑,不是命名空間

  1. 打開/frontend/web/index.php,看到
    frontend入口腳本
    首先,用數組助手類的merge方法遞歸合併數組,後覆蓋前得出最終配置,然後,將配置數據傳到Application的構造方法裏,再執行其run方法。
  2. 跳轉到verdor\yiisoft\yii2\web\Application.php的run方法,它觸發了很多事件,具體就不看了,貌似無關~,components相關東西在哪?搜索components,發現執行了coreComponents方法,其內容是
    1
    並沒有發現urlManager的默認類,並且各個配置文件都沒爲urlManager指定class,爲什麼沒報錯?因爲它調用了父類的coreComponents方法。
  3. 跳轉到verdor\yiisoft\yii2\base\Application.php,原來urlManager組件在這裏指定了類。
    2

    我們已經知道是通過coreComponents指定核心組件的類了,但它是如何調用這個方法的呢?回頭想想,在入口腳本還幹了什麼?實例化Application類時,自動調用構造方法!我們發現省略~\web\Application沒有覆蓋父類的構造方法,即看父類的構造方法

    5

  4. 跳轉到preInit方法,在這個預初始化方法裏,接受的參數是引用,即這個方法要對$config數組改造,重點看6

    大概意思是,如果配置文件沒有配置某組件或沒有爲某組件指定類,這個組件就用coreComponents指定的類。將$config變量構造好後,傳到Component::__construct($config),開始組件的具體內容,就不往下走了。

  5. 下面看組件屬性的配置,跳到/項目目錄/frontend/config/main.php,我們看到urlManager組件配置被註釋掉了,即意味着其使用了urlManager組件指定類的屬性的默認值,具體在\vendor\yiisoft\yii2\wbe\UrlManager.php
    配置文件的urlManager

    小結一下:組件配置,一指定類(無默認就要在配置文件寫明),二配置屬性,屬性就是類的成員變量

2 添加虛擬主機

爲了方便,先給前臺項目添加虛擬主機,具體看鏈接

<VirtualHost *:80>
DocumentRoot "${INSTALL_DIR}/www/advanced/frontend/web/"
ServerName frontend.advanced.com
</VirtualHost>

這步不是必須的~

3 各配置作用

以請求Site控制器的about動作爲例子

  1. 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,下面的設置都不起作用

  2. showScriptName

    • true [默認]: 不隱藏入口腳本,即要加入口腳本文件名index.php才能訪問到,http://localhost/advanced/frontend/web/index.php/site/about

    • false:按理解,設爲false,應該是http://localhost/advanced/frontend/web/site/about即可訪問,但發現是apache提示找不到頁面
      7這意味着,apache服務器找不到url請求的文件,按apache理解,省略~/web/下沒有site目錄,所以,想要實現隱藏入口腳本,還要在/frontend/web/下添加.htaccess文件,官方文檔介紹,具體步驟如下:

      1. .htaccess添加內容如下,意思是,如果請求的文件或目錄找不到,就轉到index.php
      RewriteEngine on
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . index.php           

    完成後,才能通過http://frontend.advanced.com/site/about訪問

  3. enableStrictParsing

    • false [默認]:不啓用嚴格解析路由,意思是,如果請求url與所有rules規則都不匹配的話,就按照默認的路由處理方式來處理,即按[模塊/]控制器/動作,方式去解析url。

    • true:設爲true後,當請求url與rules規則不匹配,就報錯。

      如,通過http://frontend.advanced.com/site/about請求,得到Yii框架的報錯提示
      8

      這意味着,請求經過apache的轉發,已經找到目的文件(入口腳本),目的文件運行過程中,沒有得到期望參數(沒傳或驗證不通過),因此Yii框架拋異常了

      注意與上面apache提示找不到頁面區分~

  4. suffix: 後綴名,如設置爲suffix => '.html,需通過http://frontend.advanced.com/site/about.html才能訪問到

  5. rules: 規則的配置就很複雜了,下面詳講。

4 rules配置

  1. 想訪問Siteabout動作,要在rules里加

    'site/about' => 'site/about'

    其中,左邊稱爲pattern,對應輸入的url,右邊爲route,對應[模型/]控制器/動作。

  2. 如果不想爲每個動作都加一個規則,可以這樣

    '<controller:\w+>/<action:\w+>' => '<controller>/<action>',

    可以這樣理解,左邊,接收請求url的對應值,對它們作\w驗證,即必須是字母或數字或下劃線,以/site/about爲例,驗證通過,賦值給臨時變量controller,action,右邊使用,從而找到Site控制器的about動作。

  3. 同理,模塊下的控制器動作也可以這樣實現

    '<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
  4. restful的路由規則,在研究,日後再補~

5 Notice

  • suffix 設了.html, 下面的rules都會用到,要想不用,需要在規則數組單獨聲明suffix=> ''
  • restful路由配置,pluralize參數默認爲true,假如控制器爲UserController,要通過users的url才能訪問到,設爲false的話,就不用加s,通過user即可訪問,如果控制器本來就是UsersController,不管pluralize如何配置,都是通過users訪問

相關鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章