如果您问“ Yii是什么?” 查阅 Yii Framework简介 ,其中 介绍了Yii 的优点,并概述了Yii 2.0。
路由介绍
在本使用Yii2编程系列中 ,我指导读者使用PHP的Yii2框架。
在今天的教程中,我将回顾Yii中的路由和URL创建。 当浏览器请求到达您Yii应用程序的index.php文件时,必须对其进行解析以确定要调用哪个控制器和方法。 那是路由。 链接到应用程序的各个部分的反向过程是URL创建,最好以编程方式完成。
Yii在管理路由和生成链接方面提供了很大的灵活性。 在我复习基础知识时,请跟随我。
在开始之前,请记住,我确实会尝试参加以下讨论。 如果您有任何问题或建议,请在下面发表评论,或通过Twitter @reifman与我联系 。
注意:如果您注意到Programming Yii系列剧集之间的间隔,那是因为 去年 我必须进行 脑部手术 。 感谢您的耐心和支持,很高兴能定期再次写信,我期待继续关注Yii2。
背景
Yii的URL管理器是用于解析入站请求parseRequest()以及以编程方式生成新URL createUrl()的应用程序组件。
请求被解析为路由,采用以下形式:
ControllerID/ActionID
本质上,URL Manager指示Yii创建和调用哪种控制器和操作方法。
在整个应用程序中,您需要生成可以在用户请求时正确解析的URL。 为此,使用createUrl()
可确保可以成功映射入站请求。
这是一个例子:
use yii\helpers\Url;
// Url::to() calls UrlManager::createUrl() to create a URL
$url = Url::to(['message/view', 'id' => 100]);
没有MVC框架,应用程序中的任何PHP文件都可以直接响应请求,这意味着您必须管理每个文件的安全性。 使用MVC和URL管理器,可以在中央级别提供基本的安全性,并且可以完全控制对应用程序的访问。 这是不使用普通PHP的主要原因之一-框架摇滚!
让我们深入探讨有关本主题的更多细节。
路由
用户的请求以URL的形式通过Web浏览器到达您的服务器。 让我们来看看一个用户在我的启动系列应用程序Meeting Planner上请求登录页面的情况:
https://meetingplanner.io/index.php/site/login
我的应用程序在Yii中使用了漂亮的URL(如下所述); 注意较少的查询变量。 否则,URL可能如下所示:
https://meetingplanner.io/index.php?r=site/login
无论如何, parseRequest
处理URL并使用actionLogin()
创建和调用SiteController.php。
使用漂亮的URL,URL管理器将检查注册规则。 在Meeting Planner中,它们位于公共配置文件中:
'components' => [
'urlManager' => [
'class' => 'yii\web\UrlManager',
...
'rules' => [
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'defaultRoute' => '/site/index',
],
],
如果没有规则匹配,或者到达控制器和操作时发生错误,则将引发404错误yii \ web \ NotFoundHttpException异常。
但是,在上方有一个defaultRoute
设置为可转到SiteController actionIndex的主页,该页面将覆盖不匹配的URL请求。
让我们仔细看看上面的规则之一:
'<controller:\w+>/<id:\d+>' => '<controller>/view',
它说,如果收到控制器的请求,后跟一个单词( \w+
),一个斜杠和一个数字( \d+
),则将该请求发送到具有匹配名称的控制器文件,并使用以下命令调用actionView($id)
数字,即MeetingController.php actionView(130)
meeting/view/130
调用MeetingController.php actionView(130)
。
定义规则很重要,可能会增加或降低网站的整体性能或响应时间。 您可能希望了解有关Yii的高级路由参数化以优化性能的更多信息 。 编写规则可以变得更加详细,我今天不再赘述。
漂亮的网址
如前所述,Pretty URL从Yii的基于参数的路由切换到基于路径的路由。 例如,此URL请求查看ID为130的会议。
https://meetingplanner.io/meeting/130
或此URL请求查看一个名为El Diablo Coffee的地方:
https://meetingplanner.io/place/el-diablo-coffee-co
您可能需要阅读“ 如何使用Yii2编程:可拖动行为(Envato Tuts +)”,以了解有关实现用于管理此类命名URL的块的更多信息。
要启用Pretty URL,您需要在urlManager
激活enablePrettyUrl
:
'urlManager' => [
'class' => 'yii\web\UrlManager',
// Disable index.php
'showScriptName' => false,
// Disable r= routes
'enablePrettyUrl' => true,
'rules' => array(
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
),
],
注意: 目前,您还可以使用 showScriptName
禁用URL中的index.php ; 但是,在我当前的应用程序项目中,我仍在努力创建没有index.php的URL。 跟踪此事件在我的任务列表中。
您还需要创建一个.htaccess文件并为Apache启用mod_rewrite
:
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
CatchAll模式
Yii路由的另一个不错的功能是能够轻松将您的应用程序置于维护模式。 只需在应用程序配置,操作和视图中定义catchAll
设置:
<?php
return [
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'language' => 'en', // english
'catchAll' => ['site/offline'],
'components' => [
'urlManager' => [
我还在SiteController.php和offline.php视图中添加了一个actionOffline
。
创建URL
Yii提供了一个辅助方法yii \ helpers \ Url :: to()在您的应用程序中创建将正确对应于解析规则的链接。 通过Yii的基础架构以编程方式生成链接将有助于维持应用程序代码的可管理性和可移植性。
以下是从Yii文档中创建URL的一些示例:
use yii\helpers\Url;
// creates a URL to a route: /index.php?r=post%2Findex
echo Url::to(['post/index']);
// creates a URL to a route with parameters: /index.php?r=post%2Fview&id=100
echo Url::to(['post/view', 'id' => 100]);
// creates an anchored URL: /index.php?r=post%2Fview&id=100#content
echo Url::to(['post/view', 'id' => 100, '#' => 'content']);
// creates an absolute URL: http://www.example.com/index.php?r=post%2Findex
echo Url::to(['post/index'], true);
// creates an absolute URL using the https scheme: https://www.example.com/index.php?r=post%2Findex
echo Url::to(['post/index'], 'https');
当然,如果启用了漂亮的URL格式,则创建的URL将有所不同。
这是我在会议计划网格的会议列表网格控件中生成链接的示例:
return '<div><a href="'.Url::to(['meeting/view', 'id' => $model->id]).'">'.$model->subject.'</a><br /><span class="index-participant">'.$model->getMeetingParticipants($model->id).'</span></div>';
我还在会议计划程序的出站电子邮件中包含许多链接,这些链接需要大量相同的参数来验证用户访问权限。 我创建了一个使用Url:to()
来构建这些命令的助手:
class MiscHelpers {
public static function buildCommand($meeting_id,$cmd=0,$obj_id=0,$actor_id=0,$auth_key='') {
return Url::to(['meeting/command',
'id'=>$meeting_id,
'cmd'=>$cmd,
'actor_id'=>$actor_id,
'k'=>$auth_key,
'obj_id'=>$obj_id
],true);
}
编写原始PHP代码以手动创建此类链接将非常耗时,容易出错且移植性较差。 Url::to()
在编码和故障排除方面都节省了大量时间。
注意: 我将在 下一 集中 撰写有关 Yii Helpers 的文章。 在我的助手中使用通常可访问的功能可以节省很多工作,并减少了总体编码。
收盘时
MVC入门可能会令人困惑,而路由和URL可能会参与其中。 也许我应该在本系列的早期就已经写过有关路线的文章。 无论如何,我希望您已经了解了有关Yii及其包含路由和URL的灵活应用程序设计的新知识。
在继续研究框架的不同方面时,请观看我们的《 使用Yii2编程》系列中即将发布的教程。 例如,如果您想了解更多有关高级路由的信息,请告诉我。 我欢迎功能和主题要求。 您可以在下面的评论中发布它们,或在我的Lookahead Consulting网站上给我发送电子邮件 。
如果您现在想浏览更高级的Yii2应用程序,请查看我们的启动系列和Meeting Planner 。 该应用程序现在处于Alpha版本中,您可以使用它来安排与朋友的会议。 您也可以下载代码; 它是开源的。
如果您想知道下一个Yii2教程何时到达, 请在Twitter上关注我@reifman或查看我的讲师页面 。 发布后,我的讲师页面将包含本系列中的所有文章。
相关链接
翻译自: https://code.tutsplus.com/tutorials/programming-with-yii2-routing-and-url-creation--cms-26869