yii2项目实战-路由美化以及如何正确的生成链接

更新于 2016年12月17日 by 白狼 被浏览了 705 次 

美化路由 

何为美化路由呢?美化嘛,无外乎就是给路由化化妆,让她好看点。我虽没化过妆,那好歹也是见过描描眉的。下面我们就来看看如何给你的路由添加添加点“颜色”的。 

yii的路由美化工作,全权由urlManager组件负责。默认情况下,该组件并没有开启。 

我们在配置文件backend\config\main.php中简单配置下该组件
'urlManager' => [
'enablePrettyUrl' => false,
'showScriptName' => true,
'enableStrictParsing' => false,
'suffix' => '',
'rules' => [
],
], 按照我们上文的配置,你可能看不到当前路由有什么变化,我们来做几个小例子分别讲述下要介绍的这几个参数 enablePrettyUrl:是否开启美化效果 我们把false改为true前后,分别访问下左侧的“博客”菜单项,前后对比如下:
false:/index.php?r=blog%2Findex
true:/index.php/blog/index 这效果感觉跟开了美颜相机似的。 showScriptName:是否或略脚本名index.php 就上面的链接而言,大多数情况下我们并不想展示index.php,我们更想要的是/blog/index效果,这个时候showScriptName的作用就显现出来了 不过该参数还需要我们配置web服务器如apache和nginx,为了更详细的说明,我们准备单独写篇文章说说。 enableStrictParsing:是否开启严格解析路由 什么意思呢?假设我们在开启了路由美化的功能(enablePrettyUrl设置为true),enableStrictParsing设置为false的情况下,我们直接访问/index.php/blog/index肯定是没有问题的。但是如果我们直接访问/index.php?r=blog%2Findex呢?发现页面展示的效果是/site/index(实际上这里展示的默认的路由页面),并非是博客列表页面。如果我们把enableStrictParsing参数设置为true你会发现页面直接抛出404。因为这货设置为true之后,会匹配rules选项中设定的至少一个规则,那我们这里先设置一个路由,不然没法继续了。
'rules' => [
"<controller:\w+>/<action:\w+>"=>"<controller>/<action>",
], 此时刷新下/index.php/blog/index就正常了。 rules:包含了路由的匹配规则列表 也就是说,如果我们要定制特殊的路由,就需要通过这个属性进行配置。 rules包含着我们配置的路由规则列表,当解析一个路由或者生成一个路由的时候,匹配规则的顺序是从第一条规则开始,知道匹配到第一个满足的为止。 我们来说一下rules的每一项的规则,以/blogs为例,当然这是一个不存在的路由,你可以访问下试试会不会抛出404异常。 我们在rules的第一项添加,现在我们的rules是下面这样的
'rules' => [
'/blogs' => '/blog/index',
"<controller:\w+>/<action:\w+>"=>"<controller>/<action>",
], 这其实就是把我们访问的/blogs路由映射到/blog/index路由上面了,所以我们访问/blogs才得以被解析并能正常访问/blog/index页面。 我们再举一个例子,如果我们要求访问/blogs/1可以展示/blog/view?id=1这个界面呢? 实际上/blog/view?id=1需要一个参数是id,我们可以这样做一个映射
'/blogs/<id:\d+>' => '/blog/view', 可以自行体会一下。 但是,如果我们的项目要求所有的路由都这样被解析,每一个都这样写rules岂不是很庞大很复杂? rules不只支持正则匹配,我们还可以配置controller和action匹配所有满足的路由。比如我们在开启enableStrictParsing为true后,设置的
"<controller:\w+>/<action:\w+>"=>"<controller>/<action>", 再比如如果我们想要所有的controller/id映射到controller/view界面,我们可以这样配置
'rules' => [
'/blogs' => '/blog/index',
// '/blogs/<id:\d+>' => '/blog/view',
'<controller:\w+>/<id:\d+>' => '<controller>/view',
"<controller:\w+>/<action:\w+>"=>"<controller>/<action>",
], 此时我们访问 /index.php/blog/1 会正常显示/blog/view?id=1这个界面。 suffix:url后缀 有时候我们想要访问的页面都带上.html后缀,这个时候只需要简单的配置suffix参数即可
'suffix' => '.html', 如果我们此时在访问/index.php/blog/index恐怕是不可以的,因为我们已经要求所有的url后缀都要带上.html才可以被正常解析!即只有访问 /index.php/blog/index.html 才是可以的。 urlManager的匹配规则我们掌握了,但是!整个网站的链接是要我们手动写的,难不成你天天修改规则,我还要天天修改链接的写法吗?这简直就是一场“灾难”! 举一个例子,由于网站前期并没有考虑页面路由添加.html后缀利于seo搜索的问题,小张三,哦不小张,名字有点lower,小三吧,哦不还是小张吧。小张整站的链接的写法都是这样的
<a href="/site/index">Yii Forum »</a>
<a href="/site/index2">Yii Forum2 »</a>
<a href="/site/index3">Yii Forum3 »</a> 固定死的写法,这无异于给自己埋了一颗定时炸弹! 有一天老大说了,要求我们网站所有的链接都加后缀.html。no zuo no die! 再来一个小练习考考各位: 一般情况下,我们的后台列表的数据分页是借助yii\data\Pagination生成的,正常情况下其链接是这样的
/blog/index?page=2 如果我们想要的链接是下面这种形式的,请问如何设计?
// 其中 2是具体分页的页面
/blog/index/2.html 这个例子具体典型性,请一定要先思考再继续看下面答案! 你是不是没思考,请先思考后动手尝试几种方案后再继续往下阅读! 来,我们公布看看这个案例如何解决 列表页的数据我们是通过gridview进行展示的,但数据的来源,是通过BlogSearch的search方法提供的,我们看下这个search方法,发现最终提供数据的是ActiveDataProvider实例,这个ActiveDataProvider厉害了,它还集成了分页类yii\data\Pagination。只需要通过ActiveDataProvider的pagination属性便可以配置分页类。具体的分页基础可以参考这篇文章。 我们的blog表暂时没那么多数据,为了分页效果我们暂时设置pageSize为2,这里并设置每页数量的参数为false
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 2,
'pageSizeParam' => false,
],
]); 接下来我们要做的,便是配置urlManager的路由规则,以便生成的链接满足我们的需求。 在rules中添加一条如下的规则即可
'<controller:\w+>/<action:\w+>/<page:\d+>' => '<controller>/<action>', 完整版的如下:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
'suffix' => '.html',
'rules' => [
'<controller:\w+>/<action:\w+>/<page:\d+>' => '<controller>/<action>',
"<controller:\w+>/<action:\w+>"=>"<controller>/<action>",
],
], Url工具类的使用 URL工具类实际上只的是yii\helpers\BaseUrl类,实际写所有链接的时候,我们建议通过该类来生成链接,其好处不可言喻。 如果小张所有的链接都像下面这样写,反过来想想,他准能幸福的屁颠屁颠的。
use yii\helpers\Url;
<a href="<?= Url::to(['site/index']) ?>">Yii Forum »</a>
<a href="<?= Url::toRoute('site/index') ?>">Yii Forum2 »</a>
<a href="<?= Url::toRoute(['site/index']) ?>">Yii Forum3 »</a> 细心的同学发现了我们这里其实列举了三种写法,其效果都是一样的。尤其是使用Url::to方法,参数一定要是属组形式,属组形式的参数等同于Url::toRoute的效果。 我们的重心就转移到Url::toRoute方法上面了。该方法会根据你配置的urlManager组件去生成链接,按照我们上文中对urlManager的配置,我们再来列举两个简单的案例
<a href="<?= Url::to(['/blogs']) ?>">Yii Forum4 »</a>
<a href="<?= Url::to(['site/index', 'id' => 1]) ?>">Yii Forum5 »</a> 其生成的链接形式分别是
<a href="/index.php/blogs.html">Yii Forum4 »</a>
<a href="/index.php/site/index/1.html">Yii Forum5 »</a> 关于路由的美化与链接的生成,我们就说这么多,尤其是链接的生成需要特别注意哦,no zuo no die! 如果你在学习的过程中有任何其他的疑问或者有什么复杂路由规则写不好的,下方留言我们共同交流!

  

yii2项目实战-路由美化以及如何正确的生成链接的更多相关文章

  1. Android项目实战(四十):在线生成按钮Shape的网站

    原文:Android项目实战(四十):在线生成按钮Shape的网站 AndroidButton Make  右侧设置按钮的属性,可以即时看到效果,并即时生成对应的.xml 代码,非常高效(当然熟练的话 ...

  2. 关于IIS上Yii2的Url路由美化

    Yii2默认的路由是酱紫的 http://.../admin/web/index.php?r=site/login 心中理想的美化Url应该这样  http://.../admin/web/site/ ...

  3. Hapi+MySql项目实战路由初始化(二)

    配置路由规则 将路由文件放在routes文件夹里,修改‘Server.js’文件,增加如下代码: 我们这里指明了require('./routes') routes文件夹,require可以文件但是不 ...

  4. yii2项目实战-访问控制过滤器ACF讲解

    作者:白狼 出处:http://www.manks.top/document/yii2-filter-control.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明 ...

  5. Yii2实现即可以美化路由访问又可以原始路由访问

    1. 本地环境 nginx version: nginx/1.11.1 PHP 7.1.0-dev (cli) mysql Ver 14.14 Distrib 5.7.22, for Linux (x ...

  6. Vue2+VueRouter2+webpack 构建项目实战(三):配置路由,运行页面

    制作.vue模板文件 通过前面的两篇博文的学习,我们已经建立好了一个项目.问题是,我们还没有开始制作页面.下面,我们要来做页面了. 我们还是利用 http://cnodejs.org/api 这里公开 ...

  7. QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL

    QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL 课程1   C语言程序设计高级实用速成课程 基础+进阶+自学 课程2   C语言程序设计Windows GDI图形绘 ...

  8. 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01

    书接上回,我们已经安装好Iris框架,并且构建好了Iris项目,同时配置了fresh自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发.现在我们来看看Iris的基础功能,如何编写项目入口文件 ...

  9. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

随机推荐

  1. [Java.Web]从零开始布署 Tomcat

    1. 下载 JRE 1.7 2. 下载 Tomcat 7.0.77,我使用的是红圈的压缩包版本,也可以使用绿圈的安装包版本[更省心] 3. 加入环境变量 JRE_HOME .CATALINA_HOME ...

  2. [转]Winform 经验集

    多线程篇: CheckForIllegalCrossThreadCalls = false; 更多示例可见: http://www.cnblogs.com/z5337/p/4030287.html i ...

  3. C++ 新特性-右值引用

    作为最重要的一项语言特性,右值引用(rvalue references)被引入到 C++0x中.我们可以通过操作符“&&”来声明一个右值引用,原先在C++中使用“&”操作符声明 ...

  4. MySQL 库、表

    1.库 1.库的基本操作 1.查看已有的库 show databases; 2.创建库(指定默认字符集) create database 库名 default charset=utf8; 3.查看创建 ...

  5. 基于Keepalived高可用集群的MariaDB读写分离机制实现

    一 MariaDB读写分离机制 在实现读写分离机制之前先理解一下三种主从复制方式:1.异步复制:MariaDB默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库 ...

  6. 一些常用的centos命令,记忆下,属于常用的

    一些常用的centos命令,记忆下,属于常用的 查询内网IP hostname -I 查询外网IP curl ifconfig.me 查看硬盘使用情况 df -h 查看系统资源使用率 top 查看系统 ...

  7. 聊聊flutter的UI布局

    UI布局多半是套路,熟悉套路的规则. Flutter的UI布局也有一套规则 center center可以让任何元素在屏幕中居中,既是水平居中又是垂直居中,如果想让元素从上而下排列要怎么办呢?那就得使 ...

  8. Linux虚机密码破解

    1 重启机器,在机器读秒时按回车键 2 选择要启动的操作系统按 e 3 选择kernel所在行按 e 4 末尾输入空格  single 5 敲回车 在按 b 系统将进入单用户模式 然后 可以 通过 p ...

  9. spring boot 项目打包到maven仓库供其它模块使用

    在对spring boot项目进行打包发布的时候发现其它spring boot项目服务真正引用使用该spring boot包中的类 需对打包插件做如下修改: <build> <plu ...

  10. PHP 动态添加 Mcrypt 扩展库

    简介: PHP 动态添加 Mcrypt 扩展库,这是一个支持多种加密.解密算法.模式的扩展库. shell > php -m | grep mcrypt # 如果没有输出,就是缺少这个扩展 sh ...