配置URL规则
在本小节中,我们将会学习如何配置URL规则。在开始以前,我们创建一个应用。
准备
- 按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
- 使用如下代码创建
@app/controllers/TestController.php
控制器:
<?php
namespace app\controllers;
use yii\helpers\Html;
use yii\web\Controller;
class TestController extends Controller
{
public function actionIndex()
{
return $this->renderContent(Html::tag('h2',
'Index action'
));
}
public function actionPage($alias)
{
return $this->renderContent(Html::tag('h2',
'Page is '. Html::encode($alias)
));
}
}
这就是我们即将做自定义URL的控制器。
- 为了使用干净的URL,需要配置你的应用服务器。如果你在使用带有
mod_rewrite
的Apache,并打开了AllowOverride
,那么你就可以添加如下内容到@web
文件夹下的.htaccess
文件中:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php
如何做…
我们的网站将会在/home
展示index页面,并且其它页面在/page/<alias_ here>
。此外,/about
应该定向到带有alias about的页面:
- 在
@app/config/web.php
文件中添加urlManager
组件:
'components' => [
// ..
'urlManager' => [
'enablePrettyUrl' => true,
'rules' => [
'home' => 'test/index',
'<alias:about>' => 'test/page',
'page/<alias>' => 'test/page',
]
],
// ..
],
保存过你的改动以后,你应该能浏览如下URL:
/home
/about
/page/about
/page/test
- 尝试运行
/home
URL,你将会得到如下截图:
- 尝试运行
/about
页面:
工作原理…
下面我们来回顾都做了些什么,以及是如何工作的。我们的第一条规则是:
'home' => 'test/index',
test/index
是什么?在Yii应用中,每一个控制器和它的动作都有相应的内部路由。对于一个内部路由,它的格式是moduleID/controllerID/actionID
。例如,TestController
的actionPage
方法对应的路由是test/page
。所以,为了获取控制器ID,你应该用它的不带Controller
后缀的名称,并将它的首字母小写。为了获取一个动作ID,你应该用它的不带action
前缀的方法名,同样将其首字母小写。
现在,什么是home?为了以更好的方式理解它,我们需要知道,至少是表面上,当我们使用不同的URL访问我们的应用时,都发生了些什么。
当我们使用/home
时,URL路由从上到下一个一个的检查我们的规则,尝试找到和输入URL匹配的规则。如果找到了,那么路由将会从一个分配给它的内部路由中获取到控制器和它的动作,并执行它。所以,/home
是URL模式,它定义了URL将会被处理的规则。
更多…
你也可以使用一个特殊的语法创建参数化的规则。回顾一下第三条规则:
'page/<alias>' => test/page',
这里我们定义了一个alias参数,它应该在URL中/page/
后边被指定。它可以是任何东西,并会被传递给$alias
参数:
TestController::actionPage($alias)
你可以为这样一个参数定义一个模式。我们为第二条规则做同样的事情:
'<alias:about>' => test/page'
这里的alias应该匹配about
,否则这条规则不能被应用。
参考
欲了解更多信息,参考如下地址: