yii2-路由

本文详细介绍了Yii2框架中的路由概念,从请求与响应的简单过程出发,解释了路由在处理请求中的作用。接着,文章展示了如何配置路由,包括基本的路由规则设定、美化路由的实现以及各种复杂的参数限制和请求类型的约束。最后,总结了路由配置的主要内容,强调了路由配置对映射请求到控制器的重要性。

去年写过一篇关于 yii2-router的博文,当时完全参照 yii2官网去写,结果可想而知,没人能看懂,包括我自己。今天偶然翻起,所以决定删了旧的,再重新整理一次

一、 路由的概念

首先梳理一下GET请求与相应的简单过程(针对php后端):①客户端发出GET请求(URL);②后端服务器根据 URL, 检查指定请求是一个静态文件(请求的文件真实存在于服务端),那么直接返回该文件,如果请求的文件不存在,那么就需要用到路由,根据路由规则来确定怎么处理请求,怎么查询数据库,怎么生成页面;③将上步生成的页面返回给客户端。由此可见,路由的作用其实就是分发请求。如果没理解也没关系,继续向下看。

关于上述第②步中 “怎么处理请求”、“怎么查询数据库”、“怎么生成页面”,实际就是典型的 MVC 结构;M指数据库模型,V视图,也就是怎么生成页面,C控制器。在 MVC 中,控制器整合业务流(或者说是数据流)的处理流程,视图 和 模型 主要起辅助作用。所以也就是说,路由的作用就是为了找到 URL 请求对应的 控制器,并解析出 URL请求参数给控制器,最后控制器负责处理客户端请求。

一个网站,一般会都会留有两个后端入口,index.phpadmin.phpindex.php 供浏览者访问,另一个供站长做后台管理。有人问,必须留两个吗?答案自然是否定的,留多少都成,哪怕一个请求一个接口,但是为了网站容易管理,一般都是留两个。

二、 yii2 配置

我的 yii2 项目结构如下截图:

yii2截图

其它文件都已删除,关于 router 的例子,只需要修改 config/web.php 即可满足,以下是每个文件的内容

1.config/web.php

<?php

$config = [
    'id' => 'demo',
    'basePath' => dirname(__DIR__),
    'language' => 'zh-cn',
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'components' => [
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],

        /* url 管理器 */
        'urlManager' => [
//            'enablePrettyUrl' => true,              // 美化 url
            'showScriptName' => true,               // 隐藏 index.php
//            'suffix' => '.html',                    // 后缀
            'rules' => [

//                '/'                                 => 'index/index',
            ],
        ],
    ],
];
return $config;

2.controllers/IndexController.php

<?php
namespace app\controllers;
use yii\web\Controller;

class IndexController extends Controller {
    public $layout = false;

    public function actionIndex() {
        return $this->render( '@app/views/index', [
            'title'                 => '测试',

        ]);
    }
}

3.views/index.php

<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0. maximum-scale=1.0">
    <title>测试</title>
</head>
<body>

<?php echo $title ?>

</body>
</html>

4./index.php

<?php
// 开发完 注释掉
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/vendor/yiisoft/yii2/Yii.php';
$config = require __DIR__ . '/config/web.php';

(new yii\web\Application($config))->run();

最后配置好 web 根目录,在浏览器输入 http:127.0.0.1/index.php?=index即展示如下页面:

yii2 结果

配置好环境就好,以后不再截图展示

三、yii2 router 路由配置、

为了说明方便,我的项目配置如下

1.在 URL 中明确指定请求的参数及要访问的控制器

http://127.0.0.1/index.php?r=index

/index.php: 指明请求入口的php文件

?r=index:指明请求的是IndexController控制器的默认方法(actionIndex)

2.使用美化路由

开启美化 url,隐藏了 url 中的 index.php 并添加 .html 后缀,模拟了静态网站的请求。

  • config/web.php配置如下(只粘贴修改的地方)
<?php
... 省略之前

        /* url 管理器 */
        'urlManager' => [
            'enablePrettyUrl' => true,              // 美化 url
            'showScriptName' => true,               // 隐藏 index.php
            'suffix' => '.html',                    // 后缀
            'rules' => [
//                '/'                                 => 'index/index',
            ],
        ],
... 省略之后
  • 请求的url
http://127.0.0.1/index.html

四、常用的路由配置方式

1.url中固定的命名参数

以下修改都是仅修改 config/web.php中url管理器部分

  • 配置文件
<?php
... 省略之前
/* url 管理器 */
    'urlManager' => [
    'enablePrettyUrl' => true,              // 美化 url
    'showScriptName' => true,               // 隐藏 index.php
    'suffix' => '.html',                    // 后缀
    'rules' => [
        'posts/'  => 'index/index',
    ],
],
... 省略之后
  • 请求 url
http://127.0.0.1/posts.html

2.固定参数名 + 请求参数限制

  • 配置文件
/* url 管理器 */
'urlManager' => [
    'enablePrettyUrl' => true,              // 美化 url
    'showScriptName' => true,               // 隐藏 index.php
    'suffix' => '.html',                    // 后缀
    'rules' => [
        'posts/<year:\d{4}>/' => 'index/index',
    ],
],
  • 请求url
http://127.0.0.1/posts/2014.html

<year> 表示请求参数,year=2014,后边的’\d{4}'表示对year的限制为四位数字,当然也可以再添加请求参数

3.固定参数名 + 请求参数限制 + 请求参数

  • 配置文件
/* url 管理器 */
'urlManager' => [
    'enablePrettyUrl' => true,              // 美化 url
    'showScriptName' => true,               // 隐藏 index.php
    'suffix' => '.html',                    // 后缀
    'rules' => [
        'posts/<year:\d{4}>/<category>' => 'index/index',
    ],
],
  • 请求url
http://127.0.0.1/posts/2014/分类1.html

<year> 表示请求 year=2014,category=分类1,year中冒号之后的表示year要匹配的正则。

4.请求参数选择

  • 配置文件
/* url 管理器 */
'urlManager' => [
    'enablePrettyUrl' => true,              // 美化 url
    'showScriptName' => true,               // 隐藏 index.php
    'suffix' => '.html',                    // 后缀
    'rules' => [
        'posts/<year:(2012|2013)>/' => 'index/index',
    ],
],
  • 请求 url
http://127.0.0.1/posts/2012.html

请求参数 year 必须为 2012 或 2013 这两个取值,如果请求其它值会导致找不到路由解析规则

5.url配置默认参数

  • 配置文件
/* url 管理器 */
'urlManager' => [
    'enablePrettyUrl' => true,              // 美化 url
    'showScriptName' => true,               // 隐藏 index.php
    'suffix' => '.html',                    // 后缀
    'rules' => [
        /* 其它规则 */
        [
            'pattern' => 'posts/<page:\d+>/<tag>',
            'route' => 'index/index',
            'defaults' => ['page' => 1, 'tag' => ''],
        ],
    ],
],
  • 请求 url
http://127.0.0.1/posts.html  		// 表示 page 为1,tag 为 ''
http://127.0.0.1/posts/2.html		// 表示 page 为2, tag 为 ''
http://127.0.0.1/posts/2/new.html	// 表示 page 为2,tag 为 new

6.url限制请求类型

  • 配置文件
/* url 管理器 */
'urlManager' => [
    'enablePrettyUrl' => true,              // 美化 url
    'showScriptName' => true,               // 隐藏 index.php
    'suffix' => '.html',                    // 后缀
    'rules' => [
        'GET posts/<year:(2012|2013)>/'  => 'index/index',
        'PUT,POST post/<id:\d+>' 		=> 'post/update',
    ],
],
  • 请求 url
http://127.0.0.1/posts/2012.html

限定为 GET 请求,当然通过配置也可以限定为其它请求。

四、最后小结

1、路由配置主要是配置请求的url与控制器名称对应表

2、yii2路由配置允许区分请求类型

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值