文档中心

搜索热词: 下载安装 支付插件 模板 增删改查

路由与请求
这一节介绍如何创建一个路由URL地址,并解析路由地址携带的信息或参数的含义,能完成一个简单的页面请求数据处理。
一、路由
路由就是一个可访问的URL地址,由控制器和操作(动作)、以及一个或多个参数构成。我们在应用(站点)配置文件中配置的urlManager组件,就是负责路由的 解析和创建。
根据 urlManager 中的配置,创建出来的URL可能看起来像是以下的一种格式(或者其它的格式)。 如果此URL被访问,将被解析成原来的路由和参数。

post/view.html?id=100

index.php?r=post/view&id=100

第一种方式是ShopWind系统配置的Url美化后的格式,第二种是Yii2系统默认的Url格式,您也可以配置成自己想要的格式,配置文件路径为 @shopwind/common/config/main.php 但前提是您对Yii2的urlManager组件有深入的了解,相关内容的链接请点击:使用美化的URL
二、创建URLs
系统提供了一个助手方法 yii\helpers\Url::toRoute() 用来根据提供的路由和参数创建各种各样的URL。 以下就是ShopWind系统Url美化后的例子:
use yii\helpers\Url;
use common\library\Basewind;

// 创建一个普通的路由URL:/post/index.html
echo Url::toRoute(['post/index']);

// 创建一个带路由参数的URL:/post/view.html?id=100
echo Url::toRoute(['post/view', 'id' => 100]);

// 创建一个带锚定的URL:/post/view.html?id=100#content
echo Url::toRoute(['post/view', 'id' => 100, '#' => 'content']);

// 创建一个绝对路径URL:http://www.example.com/post/index.html
echo Url::toRoute(['post/index'], true);

// 创建一个带https协议的绝对路径URL:https://www.example.com/post/index.html
echo Url::toRoute(['post/index'], 'https');

// 如果是在后台(backend)应用中,输出URL:https://admin.example.com/post/index.html
echo Url::toRoute(['post/index'], true);

// 创建一个从后台可以跳转回前台的绝对路径URL:https://www.example.com/post/index.html
echo Url::toRoute(['post/index', 'baseUrl' => Basewind::homeUrl()]);
注意:如果没有启用Url美化功能,或者修改了Url美化规则,则上面的地址可能有所不同。在不用的应用(站点)中输出的URL绝对地址,都是以该应用(站点)的访问域名为前缀。
三、请求处理
通过上面的介绍,我们已经知道怎么创建一个带参数的Url地址,那么如何在被访问的页面中接收这些参数,并处理相关的数据呢。由此,系统提供了一个yii\web\Request对象来 完成这个任务。该组件不仅能接收页面请求参数(即:$_GET)的数据,同样也能接收表单提交的参数(即:$_POST)。
要获取请求参数,你可以调用 request 组件的 get() 方法和 post() 方法。 他们分别返回 $_GET$_POST 的值。例如:
use Yii;
use common\library\Basewind;

## 等价于: $get = $_GET;
$get = Yii::$app->request->get(); 

## 等价于: $id = isset($_GET['id']) ? $_GET['id'] : null;
$id = Yii::$app->request->get('id');   

## 等价于: $id = isset($_GET['id']) ? $_GET['id'] : 1;
$id = Yii::$app->request->get('id', 1);   

## 等价于: $post = $_POST;
$post = Yii::$app->request->post(); 

## 等价于: $name = isset($_POST['name']) ? $_POST['name'] : null;
$name = Yii::$app->request->post('name');   

## 等价于: $name = isset($_POST['name']) ? $_POST['name'] : '';
$name = Yii::$app->request->post('name', '');   

## 如果需要对POST参数去空格化处理,并返回数组
$post = Basewind::trimAll(Yii::$app->request->post());

## 如果需要对GET参数去空格化处理,并返回对象
$get = Basewind::trimAll(Yii::$app->request->get(), true);

## 如果需要对GET参数去空格化和例外字段数值型处理,并返回对象
$post = Basewind::trimAll(Yii::$app->request->get(), true, ['id', 'page']);
虽然您也可以直接使用$_GET或$_POST来接收数据,但使用系统提供的request组件会更加安全可靠。此外,建议使用ShopWind提供的全局方法Basewind::trimAll对数据进行去空格化、数值型过滤 处理,会使得代码更加简洁。
另外,request组件还提供了许多方式来检测当前请求的 URL,假设被请求的 URL 是 http://example.com/admin/index.php/product?id=100, 你可以像下面描述的那样获取 URL 的各个部分:

Yii::$app->request->url 返回 /admin/index.php/product?id=100 此 URL不包括主机信息部分。

Yii::$app->request->absoluteUrl 返回 http://example.com/admin/index.php/product?id=100 包含整个URL。

Yii::$app->request->hostInfo 返回 http://example.com 只有主机信息部分。

Yii::$app->request->pathInfo 返回 /product 这个是入口脚本之后,问号之前(查询字符串)的部分。

Yii::$app->request->queryString 返回 id=100问号之后的部分。

Yii::$app->request->baseUrl 返回 /admin主机信息之后,入口脚本之前的部分。

Yii::$app->request->scriptUrl 返回 /admin/index.php没有路径信息和查询字符串部分。

Yii::$app->request->serverName 返回 example.comURL 中的主机名。

Yii::$app->request->serverPort 返回 80这是 web 服务中使用的端口。

如果您是想获取站点访问域名,更推荐您使用ShopWind提供的方法,访问PC应用(站点)域名:Basewind::homeUrl(),访问当前应用(站点)域名Basewind::siteUrl()
有关路由与请求的更多问题,可以参考Yii2官方文档:Yii2路由介绍YII2请求处理了解更多内容,也可以访问我们的 开发者社区反馈,我们会有官方技术人员在线解答。