路由和URL生成

当一个YII应用开始处理一个请求的时候,它首先要做的便是将请求的URL转化成一个路由。路由的作用是用于后续实例化相应的控制器和操作,以便处理请求,整个处理过程便叫做路由。路由的逆过程叫做URL生成,是指用给定的路由和参数信息来生成一个URL。当使用生成的URL来发出请求的时候,路由处理的过程又能够再次将其解析还原出原始的路由和参数信息。

主要负责路由和URL生成工作的是URL管理器,其被注册成为应用组件。URL管理器提供方法parseRequest()来解析请求,解析出其中的路由和参数信息。而方法 createUrl() 用于将给定的路由和参数信息,生成一个URL。通过在应用配置中配置URL管理器,可以让你的应用能够识别任意的URL格式,而不用修改已有程序代码。例如,你能使用如下的代码来生成一个URL。

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

取决于URL管理器的配置,如上代码生成的URL的样子看上去像下面这样的。假如这个URL后续被请求的话,它将被解析成上面的原始路由和参数信息。

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

URL格式

URL管理器支持两种URL格式:默认URL格式和漂亮URL格式。默认URL格式使用一个查询参数r传递路由,其他参数按照正常方式放在URL中。例如,URL /index.php?r=post/view&id=100 的路由为post/view和参数id为100。默认URL格式并不要求对URL管理器做任何配置。漂亮URL格式是使用额外的路径跟在入口脚本名之后,来展现路由和相关参数的。例如,URL /index.php/post/100的额外路径为/post/100,其展现出的路由为post/view和参数id为100。如果要使用这种URL格式,你需要根据实际需求,设计一个URL规则集。你可以通过修改URL管理器中属性enablePrettyUrl的值,来达到在这两种URL格式之间切换的目的。

路由

路由的工作可以分为两步:
1.从请求中解析出一个路由和相关参数;
2.根据路由生成响应的控制器操作,来处理该请求。

当使用默认URL格式的时候,解析出路由很简单,只要获取参数r的值便可;
当使用漂亮URL格式的时候,URL管理器会检测URL规则集,从中找出与该请求匹配的路由。如果找不到规则与之匹配,将会抛出异常yii\web\NotFoundHttpException。

一旦从请求中解析出路由,接下来要做的就是创建与该路由相关的控制器操作。路由被斜线切割成几个部分,例如,site/index会被切割成site和index。每个部分都是一个ID,它们也许指向模块、控制器或操作。从路由的第一个部分开始,应该会执行如下几步来创建模块(如果有的话)、控制器和操作:
1.设置应用主体为当前模块。
2.检查当前模块的 yii\base\Module::controllerMap 是否包含当前ID。如果是,会根据该表中的配置创建一个控制器对象,然后跳到步骤五执行该路由的后续片段。
3.检查该 ID 是否指向当前模块中 yii\base\Module::modules 属性里的模块列表中的一个模块。如果是,会根据该模块表中的配置创建一个模块对象,然后会以新创建的模块为环境,跳回步骤二解析下一段路由。
4.将该 ID 视为控制器 ID,并创建控制器对象。用下个步骤解析路由里剩下的片段。
5.控制器会在他的 yii\base\Controller::actions()里搜索当前 ID。如果找得到,它会根据该映射表中的配置创建一个操作对象;反之,控制器则会尝试创建一个与该 ID 相对应,由某个 action 方法所定义的行内操作(inline action)。

上面这些步骤中,如果有任何错误发生,应用都会抛出异常yii\web\NotFoundHttpException,意味着路由处理失败。

默认路由

当一个请求没有找到匹配的路由的时候,所谓的默认路由将会被代替使用。默认情况下,默认路由为site/index,其指向控制器site下面的操作index。你也可以通过修改应用配置中属性defaultRoute来指定它,就像下面这样:

[
// ...
'defaultRoute' => 'main/index',
];

catchAll 路由
当你的应用处于临时维护状态下时,你也许希望对于所有的请求,应用都显示相同的页面。有很多方法来实现这个目标,最简单的方法之一便是在应用配置中配置属性yii\web\Application::$catchAll,像下面这样。

[
// ...
'catchAll' => ['site/offline'],
];

创建链接

YII提供了一个帮助方法yii\helpers\Url::to(),根据提供的路由和参数信息去生成各种URL,如下是一些例子:

use yii\helpers\Url;

// creates a URL to a route: /index.php?r=post/index
echo Url::to(['post/index']); // creates a URL to a route with parameters: /index.php?r=post/view&id=100
echo Url::to(['post/view', 'id' => 100]); // creates an anchored URL: /index.php?r=post/view&id=100#content
echo Url::to(['post/view', 'id' => 100, '#' => 'content']); // creates an absolute URL: http://www.example.com/index.php?r=post/index
echo Url::to(['post/index'], true); // creates an absolute URL using the https scheme: https://www.example.com/index.php?r=post/index
echo Url::to(['post/index'], 'https');

注意,上面的例子是基于默认URL模式是开启状态的。如果漂亮URL模式被启动的话,上面创建的URL会有所不同,取决于使用的URL路由。

传递给方法 yii\helpers\Url::to()的路由信息是和上下文有关的,它可以是相对路径,也可以是绝对路径,可以根据下面的规则来标准化:

1. 如果路由传递的是空字符串,当前请求的路由将被使用;
2. 如果路由不包含任何斜杠(\),它会被认为是当前控制器的某个操作的ID,它将会被前置当前路由唯一ID;
3. 如果路由不以斜杠(\)打头,它会被认为是相对于当前模块的路由,它将会被前置当前模块的唯一ID。

=================================

未完待续。。。今日查看YII框架的中文文档,点击其中包含的某个链接竟然报错,被迫去其英文支持站点搜索相关文档,对比发现:中文文档有些内容可能有删节。于是,便想在阅读英文文档的时候,顺便做个翻译,给后来者一些便利,不知道这样做是否有意义?同时由于英文水平有限,翻译过程中难免有不足之处,还请大家多多拍砖...

原文网址:http://www.yiiframework.com/doc-2.0/guide-runtime-routing.html

YII框架路由和URL生成的更多相关文章

  1. Laravel 深入理解路由和URL生成

    原文地址: Laravel 深入理解路由和URL生成 在模板中我们一般不会直接写死url,而是用url助手生成url,本文介绍一下url助手的使用以及遇到的一些比较头疼的问题. 首先,我们创建了一个路 ...

  2. YII框架路由配置

    首先要在服务器配置(httpd.conf)中开启重写模块: #开启重写模块,将其前面的#去掉 LoadModule rewrite_module modules/mod_rewrite.so #Dir ...

  3. Yii框架学习笔记(二)将html前端模板整合到框架中

    选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/ ...

  4. asp.net core 系列 6 MVC框架路由(下)

    一.URL 生成 接着上篇讲MVC的路由,MVC 应用程序可以使用路由的 URL 生成功能,生成指向操作的 URL 链接. 生成 URL 可消除硬编码 URL,使代码更稳定.更易维护. 此部分重点介绍 ...

  5. ThinkPHP的路由规则和URL生成,结合django的URL理解

    这个知识点,我觉得蛮重要的. 不作任何路由定义的TP,URL格式和controller之间,相当于强绑定. 路由配置,让URL和controller的关系可以自定义. URL生成,让controlle ...

  6. yii框架常用url地址

    调用YII框架中 jquery:Yii::app()->clientScript->registerCoreScript('jquery');        framework/web/j ...

  7. 8.MVC框架开发(URL路由配置和URL路由传参空值处理)

    1.ASP.NET和MVC的路由请求处理 1)ASP.NET的处理 请求---------响应请求(HttpModule)--------处理请求(HttpHandler)--------把请求的资源 ...

  8. thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成(十五)

    原文:thinkphp URL规则.URL伪静态.URL路由.URL重写.URL生成(十五) 本章节:详细介绍thinkphp URL规则.URL伪静态.URL路由.URL重写.URL生成 一.URL ...

  9. Yii 1.1.17 三、数据库连接、定义模型、数据查询、验证登录、SESSION使用与URL生成

    一.数据库连接 1.配置连接参数 在database.php里面开启: 'db' => array( 'connectionString' => 'mysql:host=127.0.0.1 ...

随机推荐

  1. js学习笔记之:时间(三)

    今天来学习一个简单的时间应用:时间的倒影,如图所示:   主要知识点: 1  获取系统的时间值:2 建立一个div的倒影 div的倒影主要利用css来控制,函数值为:filter:flipv() 步骤 ...

  2. InstallShield安装包中集成第三方安装包的方案选择[转]

      我们在制作安装包时,有些情况下会涉及第三方安装的集成,这里将讨论如何调用安装第三方包,以及需要注意的事项. 第三方安装包的介质类型有很多,主要有:单独的一个Setup.exe,单独的一个msi包, ...

  3. 深入Java虚拟机读书笔记第二章平台无关性

    Java的体系结构对平台无关的支持 Java平台 Java的体系结构通过几种途径支持Java程序的平台无关性,其中主要是通过Java平台自己.Java平台扮演一个运行时Java程序与其下的硬件和操作系 ...

  4. WebService cxf 接口中获得拦截器参数

    1. 拦截器中put属性 Message message = PhaseInterceptorChain.getCurrentMessage(); message.put("AuthCode ...

  5. 一元云购完整源码 云购CMS系统 带安卓和ios手机客户端

    看起来不错的一套一元云购CMS源码,源码包里面带了安卓和ios手机客户端,手机客户端需要自己反编译.    这里不做功能和其它更多的介绍,可以自己下载后慢慢测试了解.    下面演示图为亲测截图< ...

  6. jquery cookies(2)用法实现

    example $.cookie('name', ‘value'); 设置cookie的值,把name变量的值设为value example $.cookie('name', ‘value', {ex ...

  7. spring注解机制和XML配置机制之间的比较

    XML配置的优缺点: 优点有:1. XML配置方式进一步降低了耦合,使得应用更加容易扩展,即使对配置文件进一步修改也不需要工程进行修改和重新编译.2. 在处理大的业务量的时候,用XML配置应该更加好一 ...

  8. JS 对象、HTML事件处理、JS 类型转换、Date

    1. JS 对象 <script> var Person = new Object(); Person.id = 1; Person.name = "Hello World&qu ...

  9. 用OpenGL简单编写的一个最简单贪吃蛇游戏

    刚学OpenGL的时候,写的一个最简单的贪吃蛇游戏代码 如下: //贪吃蛇游戏 #include<stdio.h> #include<stdlib.h> #include< ...

  10. JDBC小结

    老师如是说:有一个规律永远不变,就是量变引起质变,什么时候你吃的盐比我吃的米多,那你就可以教我了…… 1.JDBC是一个标准,是J2EE的一部分:讲tcp时就提到了分层思想,jdbc也是分层,即上层只 ...