中文篇:Yii 路由引导与创建

原文地址:http://www.yiichina.com/doc/guide/2.0/runtime-routing#using-pretty-urls
本文是原创翻译,帮助需要的人快速阅读。本人不保证翻译的十分精确,但基本阅读通顺理解上没有问题,如发现什么问题,也请大家留言多加指教。

路由引导与创建

1、URL格式
2、路由引导
3、创建URL
4、使用美化链接

(没找到锚,小节定不了位了喂)

路由引导

当入口脚本在调用 yii\web\Application::run() 方法时,这个方法进行的第一个操作就是解析输入的请求,然后实例化对应的控制器操作处理这个请求。 该过程就被称为引导路由(routing)。(译注:中文里既是动词也是名词)

路由引导的逆向过程就叫路由创建,就是根据给定的路由路径及相关查询参数创建一个URL。当这个URL之后被请求的时候,路由进程就能把它解析成原始的路由和查询参数负责路由和URL创建的核心部分是URL管理器,它被注册成urlManager应用程序组件。URL管理器提供了parseRequest()方法来将传入的请求解析为路由和相关联的查询参数,并且提供了createUrl()方法将上述路由和相关参数创建成一个URL。

通过在应用的配置文件里配置urlmanager组件,你不用改变自己的应用程序代码就可以让应用识别任意的url格式。例如,你可以使用下面的代码来为post/view动作创建一个URL

use yii\helpers\Url;

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

你的url也许和下面某个很像(也许是其他的形式),这取决于你对urlmanager实际配置。如果生成的URL稍后被访问到,还是会解析成原始的路由和查询参数值被访问。

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

URL格式

URL管理器支持两URL种格式:默认url模式和美化的url模式

默认的URL模式使用查询参数r来表现路由,用正常的get参数来表现和路由相关的查询参数。例如,url/index.php?r=post/view&id=100 表示路由 post/view 和 id 查询参数之为100 。默认的URL模式不要求配置urlmanager ,可应用于任何web服务器设置美化的URL模式 在入口脚本后紧跟代表路由的附加路径和徐昂管查询参数。例如,在url /index.php/post/100 里,附加的路径是 /post/100 ,也许恰好有个规则url就表示路由 post/view ,其查询参数为id值为100 。要使用美化的URL模式,你需要根据实际的url表现需求设计一套路由规则。

你可以通过切换 urlmanager的enablePrettyUrl的属性值实现在两种模式之间的切换,而不需要改变任何的应用程序代码。

路由引导

路由引导主要包含两步。第一步,输入的路由被解析成一个路由地址和相关查询参数。第二部,相应的控制动作会处理请求。

当使用默认URL格式时,将请求解析到路由中与获取名为r的GET查询参数的值一样简单。

当使用美化 的URL模式时,URL管理器将检查注册的URL规则,以找到可以将请求解析为路由的匹配项。如果找不到这样的规则,将抛出一个yii \ web \ NotFoundHttpException异常。

一旦将请求解析成路由,就是创建路由标识的控制器操作的时候了。路由被斜线分解成几个部分。例如,site/index 会被分解成site和index 。每个部分都是一个ID值,也许是模块ID,控制器ID,动作ID。从路由的第一部分开始,应用程序采取以下步骤来创建模块(如果有的话),控制器和动作:

1、将应用程序设置为当前模块;
2、检查当前模块的控制器映射是否包含当前ID。 如果是这样,将根映射中的控制器配置创建控制器对象,并且将采取步骤5来处理路由的其余部分;
3、检查ID是否指向某个罗列在当前模块的yii \ base \ Module :: modules属性中的模块。 如果是,根据模块列表中的配置创建一个模块,并且将在新创建的模块的上下文中执行步骤2处理路由的下一部分;
4、将ID视为控制器ID并创建控制器对象。路由的其余部分进行下一步;
5、控制器在其操作映射中查找当前ID。 如果找到,它将根据映射中的配置创建一个操作。 否则,控制器将尝试创建由与当前动作ID相对应的动作方法定义的内联动作。

在上述步骤中,如果发生任何错误,将抛出一个yii \ web \ NotFoundHttpException,表示路由引导进程失败。

缺省路由

如果传入请求并没有提供一个具体的路由,(一般这种情况多为于对首页的请求)此时就会启用由yii\web\Application::$defaultRoute 属性所指定的缺省路由。 该属性的默认值为 site/index,它指向 site 控制器的 index 动作。你可以像这样在应用配置中调整该属性的值:

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

catchAll 路由(全拦截路由)

有时候,你会想要将你的 Web 应用临时调整到维护模式,所有的请求下都会显示相同的信息页。当然,要实现这一点有很多种方法。这里面最简单快捷的方法就是在应用配置中设置下 yii\web\Application::$catchAll 属性:

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

有了上面的配置,site/offline 操作将会负责处理所有输入的请求。

catchAll属性是一个数组格式,使用第一个元素指定路由,其余的元素(名称 - 值对)指定要绑定到该动作的参数。

info:当这个属性打开时,开发环境的调试面板将会失效。

创建URL

Yii提供了一个helper方法 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将不同。

传递给yii\helpers\Url :: to()的路由是前后相关的。 它可以是相对路由或绝对路由,它将根据以下规则进行统一处理:

1、如果路由是个空字符串,将使用当前 yii\web\Controller::route 值;
2、如果路由中没有斜线,它被认为是当前控制器的动作ID,并且将以当前控制器的yii\web\Controller::uniqueId值添加;
3、如果路由开头没有斜线,则被认为是相对于当前模块,并且前面加上当前模块的yii\base\Module::uniqueId值。

从2.0.2版开始,您可以根据别名指定路由。 如果是这种情况,别名将首先转换成实际路由,然后根据上述规则将其转换为绝对路由。

例如,假设当前模块是admin,并且当前控制器是post,

use yii\helpers\Url;

// currently requested route: /index.php?r=admin/post/index
echo Url::to(['']);

// a relative route with action ID only: /index.php?r=admin/post/index
echo Url::to(['index']);

// a relative route: /index.php?r=admin/post/index
echo Url::to(['post/index']);

// an absolute route: /index.php?r=post/index
echo Url::to(['/post/index']);

// /index.php?r=post/index     assume the alias "@posts" is defined as "/post/index"
echo Url::to(['@posts']);

通过调用URL管理器的createUrl()和createAbsoluteUrl()方法来实现yii\helpers\Url::to()方法。 在接
下来的几个小节中,我们将介绍如何配置URL管理器来自定义创建的URL的格式。

yii\helpers\Url::to()方法还支持创建与特定路由无关的URL。 在这种情况下,您应该传递一个字符串作为其
第一个参数,而不是数组。 例如,

use yii\helpers\Url;

// currently requested URL: /index.php?r=admin/post/index
echo Url::to();

// an aliased URL: http://example.com
Yii::setAlias('@example', 'http://example.com/');
echo Url::to('@example');

// an absolute URL: http://example.com/images/logo.gif
echo Url::to('/images/logo.gif', true);

除了to() 方法, yii\helpers\Url 助手类也提供其他方便的url创建方法。例如,

use yii\helpers\Url;

// home page URL: /index.php?r=site/index
echo Url::home();

// the base URL, useful if the application is deployed in a sub-folder of the Web root
echo Url::base();

// the canonical URL of the currently requested URL
// see https://en.wikipedia.org/wiki/Canonical_link_element
echo Url::canonical();

// remember the currently requested URL and retrieve it back in later requests
Url::remember();
echo Url::previous();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值