Preface

Yii是本人很喜欢的一个PHP框架(本人并不从事PHP相关工作,对PHP其他框架也了解也不多),Yii特点:轻、简单、易上手,从Yii1.0开始用过,最近想做一个个人的站点便于记录自己的学习相关的东西,用了Yii2,感觉Yii2比Yii1要更加优雅,Yii2+Bootstrap4可以很容易搭建一个优雅的个人站点,本站就是用Yii2+Bootstrap4搭建,改天来写个Yii2+MySql+Bootstrap4+Nginx的完整教程,今天先说说在Yii2中如何让url的format为path格式,之所以写这个是因为我当时也碰到这个问题,搜索了一下发现文档写的不够简单明了,也没有具体的例子.

 

Create URL

By configuring the urlManager component in the application configuration, you can let your application recognize arbitrary URL formats without modifying your existing application code. For example, you can use the following code to create a URL for the post/view action:

先看这句createUrl的代码:

use yiihelpersUrl;
// Url::to() calls UrlManager::createUrl() to create a URL
$url = Url::to(['post/view', 'id' => 100]);

根据config里面urlManager的配置不同,生成的url可能有以下三种样式

1. /index.php?r=post%2Fview&id=100
2. /index.php/post/100
3. /posts/100

第一种就是Yii的默认样式,脚本名+r (route) + controler/action + 参数,我不喜欢这种样式

第二种是脚本名+path模式,我也不喜欢这种

第三种是隐藏叫本命的path模式,喜欢这种,不要理由,没有原因

 

UrlManager Configuration in Yii1.x

如果是在Yii1.0中,简单配置一下config中的urlManager的以下参数就可以了

/** Url Manager Configurationo **/
'urlManager'=>array(
    'urlFormat'=>'path',
    'urlSuffix'=>'.html',
    'showScriptName'=>false,
),

use yiihelpersUrl;
// Url::to() calls UrlManager::createUrl() to create a URL
$url = Url::to(['post/view', 'id' => 100]);

Output:

http://youdomain.com/posts/id/100.html

 

UrlManager Configuration in Yii2.x

Yii2.0中 UrlManager的urlFormat属性是没有的,如果配置urlFormat会报错,Yii2中的实现是这样的

'urlManager' => [
    'class' => 'yiiwebUrlManager',
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'enableStrictParsing' => false,
    'suffix'=>'.html',
]

Yii2.0的UrlManager里面有个属性叫: enablePrettyUrl,默认值是false,不配置或者配置成false,url的样式就是上面的第一种,配置后开心的createUrl一看,发现跟上面的都不一样,它是这样的,Fxxking

/posts.html?id=100

显然这也不是我想要的,这只是个半成品,<controller>/<action>是好了,参数却没有path化.

 

Url format path in Yii2.x

在Yii2.0中UrlManager里面的灵活的rules可以轻松的帮你实现,下面就举个具体的例子来说明:比如你有一个controller叫SiteController,有个actionIndex,用上面的配置createUrl的到的是这样的

use yiihelpersUrl;

$url = Url::to(['site/index']);
// output:
http://yourdomain.com/site/index.html

$url = Url::to(['site/index', 'id' => 100]);
// output:
http://yourdomain.com/site/index.html?id=100

 

UrlManager Rules in Yii2.x

现在我们来看看Yii2.0中的urlManager里面的rules的配置:

'urlManager' => [
    'class' => 'yiiwebUrlManager',
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'enableStrictParsing' => false,
    'suffix'=>'.html',
    'rules' => [
        '<controller>/<action>/<id>' => '<controller>/<action>',
    ]
]
$url = Url::to(['site/index', 'id' => 100]);
// output:
http://yourdomain.com/site/index/100.html

如果想带id在path中:

'urlManager' => [
    ...
    'rules' => [
        '<controller>/<action>/id/<id>' => '<controller>/<action>',
    ]
]
$url = Url::to(['site/index', 'id' => 100]);
// output:
http://yourdomain.com/site/index/id/100.html

上面的那句中的尖括号<id>是跟你的参数名匹配的,如果你的参数不是id,比如叫: query,配置的时候就是:query,如下:

'urlManager' => [
    'rules' => [
        '<controller>/<action>/<query>' => '<controller>/<action>',
    ]
]

$url = Url::to(['site/index', 'query' => 'what']);
// output:
http://yourdomain.com/site/index/what.html

'urlManager' => [
    'rules' => [
        '<controller>/<action>/q/<query>' => '<controller>/<action>',
    ]
]

$url = Url::to(['site/index', 'query' => 'what']);
// output:
http://yourdomain.com/site/index/q/what.html

 

Multiple Rules Example

到此其时配置已经完成了,其他的以此类推:比如你的参数是what=&else=&another=

配置的时候应该是这样的,可以多个rule一起配置

'urlManager' => [
    'rules' => [
        '<controller>/<action>/<id>' => '<controller>/<action>',
        '<controller>/<action>/q/<query>' => '<controller>/<action>',
        '<controller>/<action>/<what>/<else>/<another>' => '<controller>/<action>',
    ]
]
The end!