yii的urlManager組件配置

來源:互聯網
上載者:User

這篇文章主要介紹了關於yii的urlManager組件配置,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

配置組件主要包括:

  • 指定類。缺少的話使用預設類

  • 屬性。缺少的話使用預設類的對應屬性

1 組件簡單理解

urlManager是一個類,為什麼又把它稱為組件呢?先不用管,我們只需知道,要為組件指定類即可,如果沒有指定會報錯,除非該組件有預設類,哪些組件有預設類呢?就是核心組件,裝個B看下源碼,以yii進階模板為例。

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

  1. 開啟/frontend/web/index.php,看到

    首先,用數組助手類的merge方法遞迴合并數組,後覆蓋前得出最終配置,然後,將配置資料傳到Application的構造方法裡,再執行其run方法。

  2. 跳轉到verdor\yiisoft\yii2\web\Application.php的run方法,它觸發了很多事件,具體就不看了,貌似無關~,components相關東西在哪?搜尋components,發現執行了coreComponents方法,其內容是

    並沒有發現urlManager的預設類,並且各個設定檔都沒為urlManager指定class,為什麼沒報錯?因為它調用了父類的coreComponents方法。

  3. 跳轉到verdor\yiisoft\yii2\base\Application.php,原來urlManager組件在這裡指定了類。

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

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

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

  5. 下面看組件屬性的配置,跳到/項目目錄/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動作為例子

  1. enablePrettyUrl :

    Pis:這個設為false,下面的設定都不起作用

    • false [預設]:通過入口指令碼?r=[模組/]控制器/動作 方式訪問。即http://localhost/advanced/frontend/web/index.php?r=site/about

    • true:開啟美化路由,(注意是僅配置這個為ture,其他不配置,即用預設),通過入口指令碼/[模組/]控制器/動作 方式訪問。即http://localhost/advanced/frontend/web/index.php/site/about

  2. showScriptName:

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

    • 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檔案,官方文檔介紹,具體步驟如下:

      RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . index.php
    1. 在.htaccess新增內容如下,意思是,如果請求的檔案或目錄找不到,就轉到index.php

  3. enableStrictParsing:

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

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

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

      這意味著,請求經過apache的轉寄,已經找到目的檔案(入口指令碼),目的檔案運行過程中,沒有得到期望參數(沒傳或驗證不通過),因此Yii架構拋異常了。

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

  4. suffix: 尾碼名,如設定為suffix => '.html,需通過http://frontend.advanced.com/site/about.html才能訪問到

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

4 rules配置

  1. 想訪問Site的about動作,要在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訪問

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.