首頁 >後端開發 >php教程 >yii的urlManager元件配置

yii的urlManager元件配置

不言
不言原創
2018-05-05 09:41:473011瀏覽

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

配置元件主要包括:

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

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

yii的urlManager元件配置 元件簡單理解

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

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

  1. 開啟/frontend /web/index.php,看到
    yii的urlManager元件配置
    首先,用數組助手類別的merge方法遞歸合併數組,後覆蓋前得出最終配置,然後,將配置資料傳到Application的建構方法裡,再執行其run方法。

  2. 跳到verdor\yiisoft\yiiyii的urlManager元件配置\web\Application.php的run方法,它觸發了許多事件,具體就不看了,貌似無關~,components相關東西在哪裡?搜尋components,發現執行了coreComponents方法,其內容是
    yii的urlManager元件配置
    並沒有發現urlManager的預設類,並且各個設定檔都沒為urlManager指定class,為什麼沒報錯?因為它呼叫了父類別的coreComponents方法。

  3. 跳到verdor\yiisoft\yiiyii的urlManager元件配置\base\Application.php,原來urlManager元件在這裡指定了類別。
    yii的urlManager元件配置

    我們已經知道是透過coreComponents指定核心元件的類別了,但它是如何呼叫這個方法的呢?回頭想想,入口腳本還做了什麼?實例化Application類別時,自動呼叫建構方法!我們發現省略~\web\Application沒有覆寫父類別的建構方法,也就是看父類別的建構方法

    yii的urlManager元件配置

  4. ##跳到

    preInit方法,在這個預初始化方法裡,接受的參數是引用,也就是這個方法要對$config陣列改造,重點看yii的urlManager元件配置

    大概意思是,

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

  5. 下面看元件屬性的配置,跳到

    /專案目錄/frontend/config/main.php,我們看到urlManager元件配置被註解掉了,即表示其使用了urlManager元件指定類別的屬性的預設值,具體在\vendor\yiisoft\yiiyii的urlManager元件配置\wbe\UrlManager.php
    yii的urlManager元件配置

    小結一下:元件配置,一指定類別(無預設就要在設定檔寫明),二配置屬性,屬性就是類別的成員變數

yii的urlManager元件配置  新增虛擬主機

為了方便,先為前台專案新增虛擬主機,請看連結

<VirtualHost *:yii的urlManager元件配置0>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

  • 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提示找不到页面
      yii的urlManager元件配置这意味着,apache服务器找不到url请求的文件,按apache理解,省略~/web/下没有site目录,所以,想要实现隐藏入口脚本,还要在/frontend/web/下添加.htaccess文件,官方文档介绍,具体步骤如下:

      RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . index.php
    1. .htaccess添加内容如下,意思是,如果请求的文件或目录找不到,就转到index.php

  • enableStrictParsing

    • false [默认]:不启用严格解析路由,意思是,如果请求url与所有rules规则都不匹配的话,就按照默认的路由处理方式来处理,即按[模块/]控制器/动作,方式去解析url。

    • true:设为true后,当请求url与rules规则不匹配,就报错。

      如,通过http://frontend.advanced.com/site/about请求,得到Yii框架的报错提示
      yii的urlManager元件配置

      这意味着,请求经过apache的转发,已经找到目的文件(入口脚本),目的文件运行过程中,没有得到期望参数(没传或验证不通过),因此Yii框架抛异常了

      注意与上面apache提示找不到页面区分~

  • suffix: 后缀名,如设置为suffix => '.html,需通过http://frontend.advanced.com/site/about.html才能访问到

  • rules: 规则的配置就很复杂了,下面详讲。

  • 4 rules配置

    1. 想访问Siteabout动作,要在rules里加

      &#39;site/about&#39; => &#39;site/about&#39;

      其中,左边称为pattern,对应输入的url,右边为route,对应[模型/]控制器/动作。

    2. 如果不想为每个动作都加一个规则,可以这样

      &#39;<controller:\w+>/<action:\w+>&#39; => &#39;<controller>/<action>&#39;,

      可以这样理解,左边,接收请求url的对应值,对它们作\w验证,即必须是字母或数字或下划线,以/site/about为例,验证通过,赋值给临时变量controller,action,右边使用,从而找到Site控制器的about动作。

    3. 同理,模块下的控制器动作也可以这样实现

      &#39;<module:\w+>/<controller:\w+>/<action:\w+>&#39; => &#39;<module>/<controller>/<action>&#39;,
    4. restful的路由规则,在研究,日后再补~

    yii的urlManager元件配置 Notice

    • suffix 设了.html, 下面的rules都会用到,要想不用,需要在规则数组单独声明suffix=> ''

    • restful路由配置,pluralize参数默认为true,假如控制器为UserController,要通过users的url才能访问到,设为false的话,就不用加s,通过user即可访问,如果控制器本来就是UsersController,不管pluralize如何配置,都是通过users访问

    相关推荐:

    yii的CURD操作

    以上是yii的urlManager元件配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn