這篇文章主要介紹了關於yii的urlManager元件配置,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
配置元件主要包括:
指定類別。缺少的話使用預設類別
屬性。缺少的話使用預設類別的對應屬性
urlManager是一個類,為什麼又稱它為元件呢?先不用管,我們只需知道,要為組件指定類即可,如果沒有指定會報錯,除非該組件有預設類,哪些組件有預設類呢?就是核心元件,裝個B看下原始碼,以yii高階模板為例。
Pis:如無特別說明,下面的路徑指的是檔案具體路徑,不是命名空間
開啟/frontend /web/index.php
,看到
首先,用數組助手類別的merge方法遞歸合併數組,後覆蓋前得出最終配置,然後,將配置資料傳到Application
的建構方法裡,再執行其run方法。
跳到verdor\yiisoft\yiiyii的urlManager元件配置\web\Application.php
的run方法,它觸發了許多事件,具體就不看了,貌似無關~,components相關東西在哪裡?搜尋components
,發現執行了coreComponents方法,其內容是
並沒有發現urlManager的預設類,並且各個設定檔都沒為urlManager指定class,為什麼沒報錯?因為它呼叫了父類別的coreComponents
方法。
跳到verdor\yiisoft\yiiyii的urlManager元件配置\base\Application.php
,原來urlManager元件在這裡指定了類別。
我們已經知道是透過coreComponents
指定核心元件的類別了,但它是如何呼叫這個方法的呢?回頭想想,入口腳本還做了什麼?實例化Application
類別時,自動呼叫建構方法!我們發現省略~\web\Application
沒有覆寫父類別的建構方法,也就是看父類別的建構方法
preInit方法,在這個預初始化方法裡,接受的參數是引用,也就是這個方法要對
$config陣列改造,重點看
如果設定檔沒有配置某個元件或沒有為某元件指定類,這個元件就用coreComponents指定的類別
。將$config變數建構好後,傳到
Component::__construct($config),開始元件的具體內容,就不往下走了。
/專案目錄/frontend/config/main.php,我們看到urlManager元件配置被註解掉了,即表示其使用了
urlManager元件指定類別的屬性的預設值,具體在
\vendor\yiisoft\yiiyii的urlManager元件配置\wbe\UrlManager.php。
小結一下:元件配置,一指定類別(無預設就要在設定檔寫明),二配置屬性,屬性就是類別的成員變數
<VirtualHost *:yii的urlManager元件配置0>DocumentRoot "${INSTALL_DIR}/www/advanced/frontend/web/"ServerName frontend.advanced.com</VirtualHost>
這一步不是必須的~3 各組態作用以請求
Site#控制器的
about動作為範例
#enablePrettyUrl :
Pis:這個設為false,下面的設定都不行
http://localhost/advanced/frontend/web/index.php?r=site/about
http://localhost/advanced/frontend/web/index.php/site/about
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
在.htaccess
添加内容如下,意思是,如果请求的文件或目录找不到,就转到index.php
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
: 规则的配置就很复杂了,下面详讲。
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的路由规则,在研究,日后再补~
suffix
设了.html
, 下面的rules都会用到,要想不用,需要在规则数组单独声明suffix=> ''
restful路由配置,pluralize
参数默认为true,假如控制器为UserController
,要通过users
的url才能访问到,设为false的话,就不用加s,通过user
即可访问,如果控制器本来就是UsersController
,不管pluralize
如何配置,都是通过users
访问
相关推荐:
以上是yii的urlManager元件配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!