cyneek / yii2-routes
为Yii2框架设计的路由和过滤扩展系统,模仿Laravel的路由系统。
Requires
- yiisoft/yii2: *
This package is not auto-updated.
Last update: 2024-09-14 16:13:37 UTC
README
为Yii2框架设计的路由和过滤扩展系统,模仿Laravel的路由系统。
什么是类似Laravel的路由?
此模块改变了Yii2的路由系统定义,不再需要在应用程序的配置文件中定义路由,现在可以创建一系列包含用户定义的Web路由的文件。此模块允许通过一系列方法定义系统路由,比基本的Yii2系统更直观,其灵感来源于Laravel定义的路由系统。
由Joseba Juániz开发(@Patroklo)
最低要求
- Yii2
- Php 5.4或更高版本
未来计划
- 将手动参数传递给过滤器。
- 自动生成RESTful路由的系统。
许可证
这是一个免费软件。它根据以下BSD许可证条款发布。
版权 (c) 2014, Cyneek 保留所有权利。
重新分发和使用源代码和二进制形式,无论是否修改,只要满足以下条件
- 源代码的重新分发必须保留上述版权声明、本条件列表和以下免责声明。
- 二进制形式的重新分发必须复制上述版权声明、本条件列表和以下免责声明在随分布提供的文档和其他材料中。
- 未经事先书面许可,不得使用Cyneek或其贡献者的姓名来认可或推广源自本软件的产品。
本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性和针对特定目的的适用性保证。在任何情况下,版权所有者均不对任何直接、间接、偶然、特殊、示范性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论这种损害是由于何种原因引起的,无论基于合同、严格责任还是侵权(包括过失或不计过失)。
安装
'bootstrap' => ['log', 'routes'];
...
'components' => [
'route' => [
'class' => 'cyneek\yii2\routes\components\route',
],
]
...
'modules' => [
'routes' => [
'class' => 'cyneek\yii2\routes\Module',
'routes_dir' => array('../routes')
]
// set custom modules here
],
- 在您的@app级别创建一个routes目录。
- 使用Route类定义在此目录中插入文件。
- 大功告成!
停用模块
只需将“active” = FALSE的值添加到配置中的“routes”数组定义中,就可以停用路由模块。
'modules' => [
'routes' => [
'class' => 'cyneek\yii2\routes\Module',
'active' => FALSE
]
// set custom modules here
],
定义
注意
此路由系统默认使用Yii2 urlManager参数
-
enablePretttyUrl = TRUE
-
enableStrictParsing = TRUE
-
showScriptName = FALSE
基本路由
基本路由方法将创建一个Yii2系统可以理解的新路由。
Route::get('user', 'user/index');
Route::post('user/(:any)', 'user/load/$1');
Route::put('user/(:any), 'user/update/$1');
Route::delete('user/(:any)', 'user/delete/$1');
Route::head('user', 'user/index');
Route::patch('user/(:any), 'user/update/$1');
开发者还可以使用两种附加方法,允许他同时处理多个HTTP动词。
any
允许路由在任何HTTP方法(GET、POST、PUT、DELETE、HEAD、PATCH)下工作。
Route::any('user', 'user/index');
match
允许开发者手动定义一组HTTP动词,这些动词将唯一响应此路由。
Route::match(['GET', 'POST'], 'user', 'user/index');
命名路由
此外,还可以在基本路由方法中定义一组附加属性。
其中之一是路由命名,这将允许开发者仅使用名称而不是整个链来使用他们定义的web URL。
Route::set_name('user_update', 'admin/user/load/');
Route::get('user', 'user/index', ['as' => 'user']);
要通过名称获取路由URL,只需
echo Route::named('user');
redirect(Route::named('user'));
如果路由具有命名的参数,则可以在方法 named
的第二个参数中为它们定义值。
Route::named('user', ['id' => 12]);
如果路由具有未定义值的可选命名参数,则它们将不会显示在方法返回的URL字符串中。
命名参数
可以定义命名参数而不是Yii2在参数路由系统中使用的正则表达式。这将允许开发者在应用生命周期中获取它们的值。
有两个额外的定义通配符,(:any)
匹配正则表达式 "任何字符",(:num)
匹配正则表达式 "任何数字"。
Route::any('user/{id}', 'user/load');
定义命名参数有两种方式。全局定义,将此正则表达式或通配符分配给应用程序中所有路由中具有该名称的所有参数,局部定义,将仅影响定义此参数的路由,并将此路由中具有相同名称的任何全局路由重写。
全局定义
Route::pattern('id', '\d+');
Route::pattern('name', '(:any)');
局部定义
Route::any('user/{id}', 'user/load')->where('id', '\d+');
在局部定义中也可以使用数组来同时分配多个参数。
Route::any('user/{id}/{name}', 'user/load')->where(['id' => '\d+', 'name' => '(:any)']);
可选命名路由
还可以定义可选参数。这允许Yii2使用在URI定义的位置具有或不具有URI的路由。可选参数的定义与常规命名参数相同,但需要在定义中添加一个问号 ?
。
Route::any('user/{id?}', 'user/load')->where('id', '\d+');
这将使Yii2接受"user"和"user/12"路由,只需要一行代码即可。
可以在同一路由中堆叠不同的可选参数,也可以访问由不同排列产生的所有路由。
Route::any('user/{id?}/{name?}', 'user/load');
这将使访问到"user/12/john"、"user/john"、"user/12"、"user"成为可能。
获取命名参数值
路由类还有一个语法糖方法,允许访问在路由中定义的参数值。
Route::input('id');
路由过滤器
还可以在路由类中定义Yii2类型或手动过滤器。这同时存在于Yii2的常规过滤系统中,该系统在每个Controller的behaviors
方法中定义过滤器。这是一个附加选项,允许开发者通过路由级别而不是Controller和Action级别来定义过滤器。
开发者在路由系统中可以使用两种类型的过滤器。Yii2常规过滤器和用户定义的闭包作为过滤器使用的一种特殊类型的路由。
Yii2过滤器
要将此类过滤器分配给路由,只需在选项参数中添加一个名为 filter
的额外条目即可。这将使得当调用路由时,系统会搜索此过滤器并执行它。
Route::any('user/{id}', 'user/load', ['filter' => 'logged_in']);
要定义过滤器,需要创建一个包含常规Yii2过滤器基本数据的数组,并给它一个名称。
Route::filter('logged_in', [
'class' => \yii\filters\AccessControl::className(),
'except' => [ 'user/default/login'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
]);
手动过滤器
此外,还可以定义开发者手动编写的特殊过滤器,以匿名函数或闭包的形式存在,允许在它们内部运行 Yii2 代码。
要将此类过滤器分配到路由中,需要在 options 参数中添加一个新的附加条目,可以是 before
,如果我们希望过滤器在控制器动作执行之前启动,或者 after
,如果我们希望在动作之后启动。
Route::any('user/{id}', 'user/load', ['before' => 'check_this']);
要定义过滤器,需要创建一个闭包并将其分配给 Route 类。
Route::filter('check_this', function(){
if (Route::input('id') > 12)
{
throw new \yii\web\NotFoundHttpException(\Yii::t('yii', 'Page not found.'));
}
else
{
return TRUE;
}
});
多个过滤器
Route::any('user/{id}', 'user/load', ['before' => ['logged_in', 'check_params']]);
Route::any('user/{id}', 'user/load', ['filter' => 'logged_in|check_params']);
基于模式的过滤器
您还可以指定过滤器适用于基于其 URI 的一组路由。
Route::when('admin\/(.*)', ['filter' =>'logged_in']);
在上面的例子中,admin
过滤器将应用于所有以 admin/
开头的路由。
您还可以通过 HTTP 动词约束模式过滤器
Route::when('admin\/(.*)', ['filter' =>'logged_in'], [get]);
路由组
这允许开发者在一组路由中添加一系列选项。其主要用途是为一组路由添加 URL 前缀。
Route::group(['prefix' => 'admin', 'filter' => 'logged_in'], function(){
Route::post('update/(:any)', 'user/update');
});
子域名路由
有时应用程序可以支持一些子域名。为此,可以为这些子域名定义特定的路由。
只需定义将包含子域名的参数,Route 类将完成繁重的工作。
Route::any('user/{id}', 'user/load', ['domain' => '{id}']);
数据库路由
作为补充,现在可以将路由添加到数据库表中,该表将在路由阶段之前加载。如果定义了缓存系统,查询将无限期地缓存,具有可重置的标记依赖关系,可以通过调用 "resetDBCache" 模块方法重置。
默认情况下,数据库路由将被禁用。要使用它,应定义 "activate_database_routes" 模块参数为 true。
表中的值应存储如下
- type (字符串) (必需)
路由类型(any,post,get...)
- uri (字符串) (必需)
将监听以创建路由的 URI。
- route (字符串) (必需)
系统中将加载的控制器和动作。
- config (数组) (可选)
为这些路由定义的特殊配置。
- app (字符串) (必需)
系统当前激活的应用程序(app-frontend,app-backend,app-basic)。
type uri route config app
post user/{id} user/load NULL app-frontend
已知问题
通常,如果没有定义 baseUrl
,您可能会遇到路由问题,因为它会预置额外的 URL 字符串,您可能不会使用。
为了解决这个问题,您应该在您的配置中定义一个有效的 baseUrl
。